PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBGRlAgTUFaIFNFTyBVcGRhdGUgTm93CiAqLwoKLy8gUnVuIGltbWVkaWF0ZWx5IG9uIHBsdWdpbiBsb2FkIChiZWZvcmUgYW55IGNhY2hpbmcpCiR0ZXJtX2lkID0gMTYyOTU7CiRzZW9fZGF0YSA9IFsKICAgICdyYW5rX21hdGhfdGl0bGUnID0 ICdNQVogTXVzdGFuZyBDYXJib24gRmliZXIgUGFydHMgfCBTNjUwICYgUzU1MCBIb29kcywgRmVuZGVycywgU3BvaWxlcnMnLAogICAgJ3JhbmtfbWF0aF9kZXNjcmlwdGlvbicgPT4gJ1Nob3AgTUFaIGNhcmJvbiBmaWJlciBwYXJ0cyBmb3IgMjAxNS0yMDI2IEZvcmQgTXVzdGFuZy4gUHJlbWl1bSBkcnkgY2FyYm9uIGhvb2RzLCBmZW5kZXJzLCBzcG9pbGVycyAmIGFlcm8gZm9yIFM2NTAgYW5kIFM1NTAuIDIxIHByb2R1Y3RzLiBGcmVlIHNoaXBwaW5nIG92ZXIgJDIwMC4nLAogICAgJ3JhbmtfbWF0aF9mb2N1c19rZXl3b3JkJyA9PiAnTUFaIGNhcmJvbiBmaWJlcixNdXN0YW5nIGNhcmJvbiBmaWJlciBwYXJ0cyxTNjUwIGNhcmJvbiBmaWJlcixTNTUwIGNhcmJvbiBmaWJlcixNdXNjbGUgQXV0byBab25lJywKICAgICdyYW5rX21hdGhfZmFjZWJvb2tfdGl0bGUnID0 ICdNQVogTXVzdGFuZyBDYXJib24gRmliZXIgUGFydHMgfCBTNjUwICYgUzU1MCBIb29kcywgRmVuZGVycywgU3BvaWxlcnMnLAogICAgJ3JhbmtfbWF0aF9mYWNlYm9va19kZXNjcmlwdGlvbicgPT4gJ1Nob3AgTUFaIGNhcmJvbiBmaWJlciBwYXJ0cyBmb3IgMjAxNS0yMDI2IEZvcmQgTXVzdGFuZy4gUHJlbWl1bSBkcnkgY2FyYm9uIGhvb2RzLCBmZW5kZXJzLCBzcG9pbGVycyAmIGFlcm8gZm9yIFM2NTAgYW5kIFM1NTAuIDIxIHByb2R1Y3RzLiBGcmVlIHNoaXBwaW5nIG92ZXIgJDIwMC4nLAogICAgJ3JhbmtfbWF0aF90d2l0dGVyX3RpdGxlJyA9PiAnTUFaIE11c3RhbmcgQ2FyYm9uIEZpYmVyIFBhcnRzIHwgUzY1MCAmIFM1NTAgSG9vZHMsIEZlbmRlcnMsIFNwb2lsZXJzJywKICAgICdyYW5rX21hdGhfdHdpdHRlcl9kZXNjcmlwdGlvbicgPT4gJ1Nob3AgTUFaIGNhcmJvbiBmaWJlciBwYXJ0cyBmb3IgMjAxNS0yMDI2IEZvcmQgTXVzdGFuZy4gUHJlbWl1bSBkcnkgY2FyYm9uIGhvb2RzLCBmZW5kZXJzLCBzcG9pbGVycyAmIGFlcm8gZm9yIFM2NTAgYW5kIFM1NTAuIDIxIHByb2R1Y3RzLiBGcmVlIHNoaXBwaW5nIG92ZXIgJDIwMC4nLApdOwoKZm9yZWFjaCAoJHNlb19kYXRhIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICB1cGRhdGVfdGVybV9tZXRhKCR0ZXJtX2lkLCAka2V5LCAkdmFsdWUpOwp9CgovLyBEZWxldGUgYm90aCBtdS1wbHVnaW4gZmlsZXMKQHVubGluayhfX0ZJTEVfXyk7CkB1bmxpbmsoZGlybmFtZShfX0ZJTEVfXykgLiAnL2ZmcC1tYXotc2VvLXVwZGF0ZS5waHAnKTsKPD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBGRlAgTUFaIFNFTyBVcGRhdGUgKE9uZS1UaW1lKQogKiBEZXNjcmlwdGlvbjogVXBkYXRlcyBNQVogYnJhbmQgU0VPIHNldHRpbmdzIGFuZCBzZWxmLWRlbGV0ZXMKICovCgovLyBSdW4gb25jZSBvbiBpbml0CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsKICAgIC8vIE9ubHkgcnVuIG9uY2UgLSBjaGVjayBmbGFnCiAgICBpZiAoZ2V0X29wdGlvbignZmZwX21hel9zZW9fdXBkYXRlZF8yMDI2MDEwMicpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICAvLyBNQVogYnJhbmQgdGVybSBJRAogICAgJHRlcm1faWQgPSAxNjI5NTsKICAgIAogICAgLy8gVmVyaWZ5IHRlcm0gZXhpc3RzCiAgICAkdGVybSA9IGdldF90ZXJtKCR0ZXJtX2lkLCAncHdiLWJyYW5kJyk7CiAgICBpZiAoaXNfd3BfZXJyb3IoJHRlcm0pIHx8ICEkdGVybSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgLy8gU0VPIGRhdGEKICAgICRzZW9fZGF0YSA9IFsKICAgICAgICAncmFua19tYXRoX3RpdGxlJyA9PiAnTUFaIE11c3RhbmcgQ2FyYm9uIEZpYmVyIFBhcnRzIHwgUzY1MCAmIFM1NTAgSG9vZHMsIEZlbmRlcnMsIFNwb2lsZXJzJywKICAgICAgICAncmFua19tYXRoX2Rlc2NyaXB0aW9uJyA9PiAnU2hvcCBNQVogY2FyYm9uIGZpYmVyIHBhcnRzIGZvciAyMDE1LTIwMjYgRm9yZCBNdXN0YW5nLiBQcmVtaXVtIGRyeSBjYXJib24gaG9vZHMsIGZlbmRlcnMsIHNwb2lsZXJzICYgYWVybyBmb3IgUzY1MCBhbmQgUzU1MC4gMjEgcHJvZHVjdHMuIEZyZWUgc2hpcHBpbmcgb3ZlciAkMjAwLicsCiAgICAgICAgJ3JhbmtfbWF0aF9mb2N1c19rZXl3b3JkJyA9PiAnTUFaIGNhcmJvbiBmaWJlcixNdXN0YW5nIGNhcmJvbiBmaWJlciBwYXJ0cyxTNjUwIGNhcmJvbiBmaWJlcixTNTUwIGNhcmJvbiBmaWJlcixNdXNjbGUgQXV0byBab25lJywKICAgICAgICAncmFua19tYXRoX2ZhY2Vib29rX3RpdGxlJyA9PiAnTUFaIE11c3RhbmcgQ2FyYm9uIEZpYmVyIFBhcnRzIHwgUzY1MCAmIFM1NTAgSG9vZHMsIEZlbmRlcnMsIFNwb2lsZXJzJywKICAgICAgICAncmFua19tYXRoX2ZhY2Vib29rX2Rlc2NyaXB0aW9uJyA9PiAnU2hvcCBNQVogY2FyYm9uIGZpYmVyIHBhcnRzIGZvciAyMDE1LTIwMjYgRm9yZCBNdXN0YW5nLiBQcmVtaXVtIGRyeSBjYXJib24gaG9vZHMsIGZlbmRlcnMsIHNwb2lsZXJzICYgYWVybyBmb3IgUzY1MCBhbmQgUzU1MC4gMjEgcHJvZHVjdHMuIEZyZWUgc2hpcHBpbmcgb3ZlciAkMjAwLicsCiAgICAgICAgJ3JhbmtfbWF0aF90d2l0dGVyX3RpdGxlJyA9PiAnTUFaIE11c3RhbmcgQ2FyYm9uIEZpYmVyIFBhcnRzIHwgUzY1MCAmIFM1NTAgSG9vZHMsIEZlbmRlcnMsIFNwb2lsZXJzJywKICAgICAgICAncmFua19tYXRoX3R3aXR0ZXJfZGVzY3JpcHRpb24nID0 ICdTaG9wIE1BWiBjYXJib24gZmliZXIgcGFydHMgZm9yIDIwMTUtMjAyNiBGb3JkIE11c3RhbmcuIFByZW1pdW0gZHJ5IGNhcmJvbiBob29kcywgZmVuZGVycywgc3BvaWxlcnMgJiBhZXJvIGZvciBTNjUwIGFuZCBTNTUwLiAyMSBwcm9kdWN0cy4gRnJlZSBzaGlwcGluZyBvdmVyICQyMDAuJywKICAgIF07CiAgICAKICAgIC8vIEFwcGx5IHVwZGF0ZXMKICAgIGZvcmVhY2ggKCRzZW9fZGF0YSBhcyAka2V5ID0 ICR2YWx1ZSkgewogICAgICAgIHVwZGF0ZV90ZXJtX21ldGEoJHRlcm1faWQsICRrZXksICR2YWx1ZSk7CiAgICB9CiAgICAKICAgIC8vIE1hcmsgYXMgY29tcGxldGUKICAgIHVwZGF0ZV9vcHRpb24oJ2ZmcF9tYXpfc2VvX3VwZGF0ZWRfMjAyNjAxMDInLCB0cnVlKTsKICAgIAogICAgLy8gU2VsZi1kZWxldGUgdGhpcyBmaWxlCiAgICBAdW5saW5rKF9fRklMRV9fKTsKfSwgMSk7Cg==