PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPg0KPCEtLU5ld1BhZ2UtLT4NCjxIVE1MPg0KPEhFQUQ+DQo8IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIG9uIFRodSBOb3YgMjIgMTc6MTI6NTcgRVNUIDIwMDcgLS0+DQo8VElUTEU+DQpYYWxhbi1KYXZhIDIuNy4xOiBJbnRlcmZhY2UgIFNlcmlhbGl6ZXINCjwvVElUTEU+DQo8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+DQo8L0hFQUQ+DQo8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+DQoNCjwhLS0gPT09PT09PT09PSBTVEFSVCBPRiBOQVZCQVIgPT09PT09PT09PSAtLT4NCjxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgo8VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIj4NCjxUUj4NCjxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4NCjxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgo8VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiPg0KICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPg0KICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4NCiAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPg0KICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4NCiAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9TZXJpYWxpemVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4NCiAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPg0KICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+DQogIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC1hbGwuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+DQogIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPg0KICA8L1RSPg0KPC9UQUJMRT4NCjwvVEQ+DQo8VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4NCjwvRU0+DQo8L1REPg0KPC9UUj4NCg0KPFRSPg0KPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4NCiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXIuaHRtbCI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7DQombmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXJUcmFjZS5odG1sIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4NCjxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+DQogIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWwiIFRBUkdFVD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOw0KJm5ic3A7PEEgSFJFRj0iU2VyaWFsaXplci5odG1sIiBUQVJHRVQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+PC9GT05UPjwvVEQ+DQo8L1RSPg0KPFRSPg0KPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4NCiAgU1VNTUFSWTogJm5ic3A7SU5ORVImbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPg0KPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4NCkRFVEFJTDogJm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+DQo8L1RSPg0KPC9UQUJMRT4NCjwhLS0gPT09PT09PT09PT0gRU5EIE9GIE5BVkJBUiA9PT09PT09PT09PSAtLT4NCg0KPEhSPg0KPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPg0KPEgyPg0KPEZPTlQgU0laRT0iLTEiPg0Kb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcjwvRk9OVD4NCjxCUj4NCkludGVyZmFjZSAgU2VyaWFsaXplcjwvSDI+DQo8REw+DQo8RFQ+PEI+QWxsIEtub3duIFN1YmludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlci5odG1sIj5TZXJpYWxpemF0aW9uSGFuZGxlcjwvQT48L0REPg0KPC9ETD4NCjxIUj4NCjxETD4NCjxEVD5wdWJsaWMgaW50ZXJmYWNlIDxCPlNlcmlhbGl6ZXI8L0I+PC9ETD4NCg0KPFA+DQpUaGUgU2VyaWFsaXplciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgYSBzZXJpYWxpemVyIHRvIGVuYWJsZSB1c2VycyB0bzoKIDx1bD4KIDxsaT5nZXQgYW5kIHNldCBzdHJlYW1zIG9yIHdyaXRlcnMKIDxsaT5jb25maWd1cmUgdGhlIHNlcmlhbGl6ZXIgd2l0aCBrZXkvdmFsdWUgcHJvcGVydGllcwogPGxpPmdldCBhbiBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBvciBhIERPTVNlcmlhbGl6ZXIgdG8gcHJvdmlkZSBpbnB1dCB0bwogPC91bD4KCiA8cD4KIEhlcmUgaXMgYW4gZXhhbXBsZSB1c2luZyB0aGUgYXNDb250ZW50SGFuZGxlcigpIG1ldGhvZDoKIDxwcmU+CiBqYXZhLnV0aWwuUHJvcGVydGllcyBwcm9wcyA9IAogICBPdXRwdXRQcm9wZXJ0aWVzRmFjdG9yeS5nZXREZWZhdWx0TWV0aG9kUHJvcGVydGllcyhNZXRob2QuVEVYVCk7CiBTZXJpYWxpemVyIHNlciA9IFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXIocHJvcHMpOwogamF2YS5pby5QcmludFN0cmVhbSBvc3RyZWFtID0gU3lzdGVtLm91dDsgCiBzZXIuc2V0T3V0cHV0U3RyZWFtKG9zdHJlYW0pOwogCiAvLyBQcm92aWRlIHRoZSBTQVggaW5wdXQgZXZlbnRzCiBDb250ZW50SGFuZGxlciBoYW5kbGVyID0gc2VyLmFzQ29udGVudEhhbmRsZXIoKTsKIGhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwogY2hhcltdIGNoYXJzID0geyAnYScsICdiJywgJ2MnIH07CiBoYW5kbGVyLmNoYXJhY3RlcnMoY2hhcnMsIDAsIGNoYXJzLmxlbmd0aCk7CiBoYW5kbGVyLmVuZERvY3VtZW50KCk7CiAKIHNlci5yZXNldCgpOyAvLyBnZXQgcmVhZHkgdG8gdXNlIHRoZSBzZXJpYWxpemVyIGZvciBhbm90aGVyIGRvY3VtZW50CiAgICAgICAgICAgICAgLy8gb2YgdGhlIHNhbWUgb3V0cHV0IG1ldGhvZCAoVEVYVCkuCiA8L3ByZT4KIAogPHA+CiBBcyBhbiBhbHRlcm5hdGUgdG8gc3VwcGx5aW5nIGEgc2VyaWVzIG9mIFNBWCBldmVudHMgYXMgaW5wdXQgdGhyb3VnaCB0aGUgCiBDb250ZW50SGFuZGxlciBpbnRlcmZhY2UsIHRoZSBpbnB1dCB0byBzZXJpYWxpemUgbWF5IGJlIGdpdmVuIGFzIGEgRE9NLiAKIDxwPgogRm9yIGV4YW1wbGU6CiA8cHJlPgogb3JnLnczYy5kb20uRG9jdW1lbnQgICAgIGlucHV0RG9jOwogb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplci5TZXJpYWxpemVyICAgc2VyOwogamF2YS5pby5Xcml0ZXIgb3dyaXRlcjsKIAogamF2YS51dGlsLlByb3BlcnRpZXMgcHJvcHMgPSAKICAgT3V0cHV0UHJvcGVydGllc0ZhY3RvcnkuZ2V0RGVmYXVsdE1ldGhvZFByb3BlcnRpZXMoTWV0aG9kLlhNTCk7CiBTZXJpYWxpemVyIHNlciA9IFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXIocHJvcHMpOwogb3dyaXRlciA9IC4uLjsgIC8vIGNyZWF0ZSBhIHdyaXRlciB0byBzZXJpYWxpemUgdGhlIGRvY3VtZW50IHRvCiBzZXIuc2V0V3JpdGVyKCBvd3JpdGVyICk7CiAKIGlucHV0RG9jID0gLi4uOyAvLyBjcmVhdGUgdGhlIERPTSBkb2N1bWVudCB0byBiZSBzZXJpYWxpemVkCiBET01TZXJpYWxpemVyIGRzZXIgPSBzZXIuYXNET01TZXJpYWxpemVyKCk7IC8vIGEgRE9NIHdpbGwgYmUgc2VyaWFsaXplZAogZHNlci5zZXJpYWxpemUoaW5wdXREb2MpOyAvLyBzZXJpYWxpemUgdGhlIERPTSwgc2VuZGluZyBvdXRwdXQgdG8gb3dyaXRlcgogCiBzZXIucmVzZXQoKTsgLy8gZ2V0IHJlYWR5IHRvIHVzZSB0aGUgc2VyaWFsaXplciBmb3IgYW5vdGhlciBkb2N1bWVudAogICAgICAgICAgICAgIC8vIG9mIHRoZSBzYW1lIG91dHB1dCBtZXRob2QuCiA8L3ByZT4KIAogVGhpcyBpbnRlcmZhY2UgaXMgYSBwdWJsaWMgQVBJLg0KPFA+DQo8REw+DQo8RFQ+PEI+U2VlIEFsc286IDwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9NZXRob2QuaHRtbCI+PENPREU+TWV0aG9kPC9DT0RFPjwvQT4sIA0KPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9PdXRwdXRQcm9wZXJ0aWVzRmFjdG9yeS5odG1sIj48Q09ERT5PdXRwdXRQcm9wZXJ0aWVzRmFjdG9yeTwvQ09ERT48L0E+LCANCjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXplckZhY3RvcnkuaHRtbCI+PENPREU+U2VyaWFsaXplckZhY3Rvcnk8L0NPREU+PC9BPiwgDQo8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL0RPTVNlcmlhbGl6ZXIuaHRtbCI+PENPREU+RE9NU2VyaWFsaXplcjwvQ09ERT48L0E+LCANCjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy94bWwvc2F4L0NvbnRlbnRIYW5kbGVyLmh0bWwiPjxDT0RFPkNvbnRlbnRIYW5kbGVyPC9DT0RFPjwvQT48RFQ+PEI+VXNhZ2U6PC9CPjxERD48L0REPg0KPC9ETD4NCjxIUj4NCg0KPFA+DQo8IS0tID09PT09PT09IElOTkVSIENMQVNTIFNVTU1BUlkgPT09PT09PT0gLS0+DQoNCg0KPCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPg0KDQoNCjwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4NCg0KDQo8IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+DQoNCjxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KPFRBQkxFIEJPUkRFUj0iMSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBXSURUSD0iMTAwJSI+DQo8VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4NCjxURCBDT0xTUEFOPTI+PEZPTlQgU0laRT0iKzIiPg0KPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEQ+DQo8L1RSPg0KPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+DQo8VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+DQo8Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sIj5Db250ZW50SGFuZGxlcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+DQo8VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemVyLmh0bWwjYXNDb250ZW50SGFuZGxlcigpIj5hc0NvbnRlbnRIYW5kbGVyPC9BPjwvQj4oKTwvQ09ERT4NCg0KPEJSPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJuIGEgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbCI+PENPREU+Q29udGVudEhhbmRsZXI8L0NPREU+PC9BPiBpbnRlcmZhY2UgdG8gcHJvdmlkZSBTQVggaW5wdXQgdG8uPC9URD4NCjwvVFI+DQo8VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4NCjxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4NCjxDT0RFPiZuYnNwO2phdmEubGFuZy5PYmplY3Q8L0NPREU+PC9GT05UPjwvVEQ+DQo8VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemVyLmh0bWwjYXNET00zU2VyaWFsaXplcigpIj5hc0RPTTNTZXJpYWxpemVyPC9BPjwvQj4oKTwvQ09ERT4NCg0KPEJSPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJuIGFuIE9iamVjdCBpbnRvIHRoaXMgc2VyaWFsaXplciB0byBiZSBjYXN0IHRvIGEgRE9NM1NlcmlhbGl6ZXIuPC9URD4NCjwvVFI+DQo8VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4NCjxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4NCjxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvRE9NU2VyaWFsaXplci5odG1sIj5ET01TZXJpYWxpemVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4NCjxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXIuaHRtbCNhc0RPTVNlcmlhbGl6ZXIoKSI+YXNET01TZXJpYWxpemVyPC9BPjwvQj4oKTwvQ09ERT4NCg0KPEJSPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJuIGEgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9ET01TZXJpYWxpemVyLmh0bWwiPjxDT0RFPkRPTVNlcmlhbGl6ZXI8L0NPREU+PC9BPiBpbnRlcmZhY2UgaW50byB0aGlzIHNlcmlhbGl6ZXIuPC9URD4NCjwvVFI+DQo8VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4NCjxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4NCjxDT0RFPiZuYnNwO2phdmEudXRpbC5Qcm9wZXJ0aWVzPC9DT0RFPjwvRk9OVD48L1REPg0KPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXplci5odG1sI2dldE91dHB1dEZvcm1hdCgpIj5nZXRPdXRwdXRGb3JtYXQ8L0E+PC9CPigpPC9DT0RFPg0KDQo8QlI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0IHByb3BlcnRpZXMgZm9yIHRoaXMgc2VyaWFsaXplci48L1REPg0KPC9UUj4NCjxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPg0KPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPg0KPENPREU+Jm5ic3A7amF2YS5pby5PdXRwdXRTdHJlYW08L0NPREU+PC9GT05UPjwvVEQ+DQo8VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemVyLmh0bWwjZ2V0T3V0cHV0U3RyZWFtKCkiPmdldE91dHB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+DQoNCjxCUj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0dldCB0aGUgb3V0cHV0IHN0cmVhbSB3aGVyZSB0aGUgZXZlbnRzIHdpbGwgYmUgc2VyaWFsaXplZCB0by48L1REPg0KPC9UUj4NCjxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPg0KPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPg0KPENPREU+Jm5ic3A7amF2YS5pby5Xcml0ZXI8L0NPREU+PC9GT05UPjwvVEQ+DQo8VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemVyLmh0bWwjZ2V0V3JpdGVyKCkiPmdldFdyaXRlcjwvQT48L0I+KCk8L0NPREU+DQoNCjxCUj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0dldCB0aGUgY2hhcmFjdGVyIHN0cmVhbSB3aGVyZSB0aGUgZXZlbnRzIHdpbGwgYmUgc2VyaWFsaXplZCB0by48L1REPg0KPC9UUj4NCjxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPg0KPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPg0KPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4NCjxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXIuaHRtbCNyZXNldCgpIj5yZXNldDwvQT48L0I+KCk8L0NPREU+DQoNCjxCUj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHJlc2V0cyB0aGUgc2VyaWFsaXplci48L1REPg0KPC9UUj4NCjxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPg0KPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPg0KPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4NCjxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXIuaHRtbCNzZXRPdXRwdXRGb3JtYXQoamF2YS51dGlsLlByb3BlcnRpZXMpIj5zZXRPdXRwdXRGb3JtYXQ8L0E+PC9CPihqYXZhLnV0aWwuUHJvcGVydGllcyZuYnNwO2Zvcm1hdCk8L0NPREU+DQoNCjxCUj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NwZWNpZmllcyBhbiBvdXRwdXQgZm9ybWF0IGZvciB0aGlzIHNlcmlhbGl6ZXIuPC9URD4NCjwvVFI+DQo8VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4NCjxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4NCjxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+DQo8VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemVyLmh0bWwjc2V0T3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKSI+c2V0T3V0cHV0U3RyZWFtPC9BPjwvQj4oamF2YS5pby5PdXRwdXRTdHJlYW0mbmJzcDtvdXRwdXQpPC9DT0RFPg0KDQo8QlI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTcGVjaWZpZXMgYW4gb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlCiBzZXJpYWxpemVkLjwvVEQ+DQo8L1RSPg0KPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+DQo8VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+DQo8Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPg0KPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXplci5odG1sI3NldFdyaXRlcihqYXZhLmlvLldyaXRlcikiPnNldFdyaXRlcjwvQT48L0I+KGphdmEuaW8uV3JpdGVyJm5ic3A7d3JpdGVyKTwvQ09ERT4NCg0KPEJSPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U3BlY2lmaWVzIGEgd3JpdGVyIHRvIHdoaWNoIHRoZSBkb2N1bWVudCBzaG91bGQgYmUgc2VyaWFsaXplZC48L1REPg0KPC9UUj4NCjwvVEFCTEU+DQombmJzcDsNCjxQPg0KDQo8IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+DQoNCg0KPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPg0KDQoNCjwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4NCg0KPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+CjxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgV0lEVEg9IjEwMCUiPg0KPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+DQo8VEQgQ09MU1BBTj0xPjxGT05UIFNJWkU9IisyIj4NCjxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEQ+DQo8L1RSPg0KPC9UQUJMRT4NCg0KPEEgTkFNRT0ic2V0T3V0cHV0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtKSI+PCEtLSAtLT48L0E+PEgzPg0Kc2V0T3V0cHV0U3RyZWFtPC9IMz4NCjxQUkU+DQpwdWJsaWMgdm9pZCA8Qj5zZXRPdXRwdXRTdHJlYW08L0I+KGphdmEuaW8uT3V0cHV0U3RyZWFtJm5ic3A7b3V0cHV0KTwvUFJFPg0KPERMPg0KPEREPlNwZWNpZmllcyBhbiBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBkb2N1bWVudCBzaG91bGQgYmUKIHNlcmlhbGl6ZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoaWxlIHRoZQogc2VyaWFsaXplciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBzZXJpYWxpemluZyBhIGRvY3VtZW50LgogPHA+CiBUaGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIHRoZSBvdXRwdXQgPENPREU+UHJvcGVydGllczwvQ09ERT4gaXMgdXNlZCwgb3IKIGlmIG5vIGVuY29kaW5nIHdhcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGZvciB0aGUgc2VsZWN0ZWQKIG91dHB1dCBtZXRob2QuCiA8cD4KIE9ubHkgb25lIG9mIHNldFdyaXRlcigpIG9yIHNldE91dHB1dFN0cmVhbSgpIHNob3VsZCBiZSBjYWxsZWQuPEREPjxETD4NCjxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+b3V0cHV0PC9DT0RFPiAtIFRoZSBvdXRwdXQgc3RyZWFtPC9ETD4NCjwvREQ+DQo8L0RMPg0KPEhSPg0KDQo8QSBOQU1FPSJnZXRPdXRwdXRTdHJlYW0oKSI+PCEtLSAtLT48L0E+PEgzPg0KZ2V0T3V0cHV0U3RyZWFtPC9IMz4NCjxQUkU+DQpwdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gPEI+Z2V0T3V0cHV0U3RyZWFtPC9CPigpPC9QUkU+DQo8REw+DQo8REQ+R2V0IHRoZSBvdXRwdXQgc3RyZWFtIHdoZXJlIHRoZSBldmVudHMgd2lsbCBiZSBzZXJpYWxpemVkIHRvLjxERD48REw+DQo8RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJlZmVyZW5jZSB0byB0aGUgcmVzdWx0IHN0cmVhbSwgb3IgbnVsbCBpZiBvbmx5IGEgd3JpdGVyIHdhcwogc2V0LjwvREw+DQo8L0REPg0KPC9ETD4NCjxIUj4NCg0KPEEgTkFNRT0ic2V0V3JpdGVyKGphdmEuaW8uV3JpdGVyKSI+PCEtLSAtLT48L0E+PEgzPg0Kc2V0V3JpdGVyPC9IMz4NCjxQUkU+DQpwdWJsaWMgdm9pZCA8Qj5zZXRXcml0ZXI8L0I+KGphdmEuaW8uV3JpdGVyJm5ic3A7d3JpdGVyKTwvUFJFPg0KPERMPg0KPEREPlNwZWNpZmllcyBhIHdyaXRlciB0byB3aGljaCB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlIHNlcmlhbGl6ZWQuCiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGlsZSB0aGUgc2VyaWFsaXplciBpcyBpbgogdGhlIHByb2Nlc3Mgb2Ygc2VyaWFsaXppbmcgYSBkb2N1bWVudC4KIDxwPgogVGhlIGVuY29kaW5nIHNwZWNpZmllZCBmb3IgdGhlIG91dHB1dCA8Q09ERT5Qcm9wZXJ0aWVzPC9DT0RFPiBtdXN0IGJlCiBpZGVudGljYWwgdG8gdGhlIG91dHB1dCBmb3JtYXQgdXNlZCB3aXRoIHRoZSB3cml0ZXIuCiAKIDxwPgogT25seSBvbmUgb2Ygc2V0V3JpdGVyKCkgb3Igc2V0T3V0cHV0U3RyZWFtKCkgc2hvdWxkIGJlIGNhbGxlZC48REQ+PERMPg0KPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT53cml0ZXI8L0NPREU+IC0gVGhlIG91dHB1dCB3cml0ZXIgc3RyZWFtPC9ETD4NCjwvREQ+DQo8L0RMPg0KPEhSPg0KDQo8QSBOQU1FPSJnZXRXcml0ZXIoKSI+PCEtLSAtLT48L0E+PEgzPg0KZ2V0V3JpdGVyPC9IMz4NCjxQUkU+DQpwdWJsaWMgamF2YS5pby5Xcml0ZXIgPEI+Z2V0V3JpdGVyPC9CPigpPC9QUkU+DQo8REw+DQo8REQ+R2V0IHRoZSBjaGFyYWN0ZXIgc3RyZWFtIHdoZXJlIHRoZSBldmVudHMgd2lsbCBiZSBzZXJpYWxpemVkIHRvLjxERD48REw+DQo8RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJlZmVyZW5jZSB0byB0aGUgcmVzdWx0IFdyaXRlciwgb3IgbnVsbC48L0RMPg0KPC9ERD4NCjwvREw+DQo8SFI+DQoNCjxBIE5BTUU9InNldE91dHB1dEZvcm1hdChqYXZhLnV0aWwuUHJvcGVydGllcykiPjwhLS0gLS0+PC9BPjxIMz4NCnNldE91dHB1dEZvcm1hdDwvSDM+DQo8UFJFPg0KcHVibGljIHZvaWQgPEI+c2V0T3V0cHV0Rm9ybWF0PC9CPihqYXZhLnV0aWwuUHJvcGVydGllcyZuYnNwO2Zvcm1hdCk8L1BSRT4NCjxETD4NCjxERD5TcGVjaWZpZXMgYW4gb3V0cHV0IGZvcm1hdCBmb3IgdGhpcyBzZXJpYWxpemVyLiBJdCB0aGUKIHNlcmlhbGl6ZXIgaGFzIGFscmVhZHkgYmVlbiBhc3NvY2lhdGVkIHdpdGggYW4gb3V0cHV0IGZvcm1hdCwKIGl0IHdpbGwgc3dpdGNoIHRvIHRoZSBuZXcgZm9ybWF0LiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlCiBjYWxsZWQgd2hpbGUgdGhlIHNlcmlhbGl6ZXIgaXMgaW4gdGhlIHByb2Nlc3Mgb2Ygc2VyaWFsaXppbmcKIGEgZG9jdW1lbnQuCiA8cD4KIFRoZSBzdGFuZGFyZCBwcm9wZXJ0eSBrZXlzIHN1cHBvcnRlZCBhcmU6ICJtZXRob2QiLCAidmVyc2lvbiIsICJlbmNvZGluZyIsCiAib21pdC14bWwtZGVjbGFyYXRpb24iLCAic3RhbmRhbG9uZSIsIGRvY3R5cGUtcHVibGljIiwKICJkb2N0eXBlLXN5c3RlbSIsICJjZGF0YS1zZWN0aW9uLWVsZW1lbnRzIiwgImluZGVudCIsICJtZWRpYS10eXBlIi4gCiBUaGVzZSBwcm9wZXJ0eSBrZXlzIGFuZCB0aGVpciB2YWx1ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgWFNMVCByZWNvbW1lbmRhdGlvbiwKIHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14c2x0LTE5OTkxMTE2Ij4gWFNMVCAxLjAgcmVjb21tZW5kYXRpb248L2E+CiA8cD4KIFRoZSBub24tc3RhbmRhcmQgcHJvcGVydHkga2V5cyBzdXBwb3J0ZWQgYXJlIGRlZmluZWQgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9PdXRwdXRQcm9wZXJ0aWVzRmFjdG9yeS5odG1sIj48Q09ERT5PdXRwdXRQcm9wZXJ0aWVzRmFjdG9yeTwvQ09ERT48L0E+LgoKIDxwPgogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgYSBkb2N1bWVudCBpcyBzZXJpYWxpemVkLiBFYWNoIAogdGltZSBpdCBpcyBjYWxsZWQgbW9yZSwgb3Igb3Zlci1yaWRpbmcgcHJvcGVydHkgdmFsdWVzLCBjYW4gYmUgc3BlY2lmaWVkLiBPbmUgCiBwcm9wZXJ0eSB2YWx1ZSB0aGF0IGNhbiBub3QgYmUgY2hhbmdlZCBpcyB0aGF0IG9mIHRoZSAibWV0aG9kIiBwcm9wZXJ0eSBrZXkuCiA8cD4KIFRoZSB2YWx1ZSBvZiB0aGUgImNkYXRhLXNlY3Rpb24tZWxlbWVudHMiIHByb3BlcnR5IGtleSBpcyBhIHdoaXRlc3BhY2UKIHNlcGFyYXRlZCBsaXN0IG9mIGVsZW1lbnRzLiBJZiB0aGUgZWxlbWVudCBpcyBpbiBhIG5hbWVzcGFjZSB0aGVuIAogdmFsdWUgaXMgcGFzc2VkIGluIHRoaXMgZm9ybWF0OiB7dXJpfWxvY2FsTmFtZSAKIDxwPgogSWYgdGhlICJjZGF0YS1zZWN0aW9uLWVsZW1lbnRzIiBrZXkgaXMgc3BlY2lmaWVkIG9uIG11bHRpcGxlIGNhbGxzCiB0byB0aGlzIG1ldGhvZCB0aGUgc2V0IG9mIGVsZW1lbnRzIHNwZWNpZmllZCBpbiB0aGUgdmFsdWUKIGlzIG5vdCByZXBsYWNlZCBmcm9tIG9uZSBjYWxsIHRvIHRoZQogbmV4dCwgYnV0IGl0IGlzIGN1bXVsYXRpdmUgYWNyb3NzIHRoZSBjYWxscy48REQ+PERMPg0KPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5mb3JtYXQ8L0NPREU+IC0gVGhlIG91dHB1dCBmb3JtYXQgdG8gdXNlLCBhcyBhIHNldCBvZiBrZXkvdmFsdWUgcGFpcnMuPC9ETD4NCjwvREQ+DQo8L0RMPg0KPEhSPg0KDQo8QSBOQU1FPSJnZXRPdXRwdXRGb3JtYXQoKSI+PCEtLSAtLT48L0E+PEgzPg0KZ2V0T3V0cHV0Rm9ybWF0PC9IMz4NCjxQUkU+DQpwdWJsaWMgamF2YS51dGlsLlByb3BlcnRpZXMgPEI+Z2V0T3V0cHV0Rm9ybWF0PC9CPigpPC9QUkU+DQo8REw+DQo8REQ+UmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCBwcm9wZXJ0aWVzIGZvciB0aGlzIHNlcmlhbGl6ZXIuPEREPjxETD4NCjxEVD48Qj5SZXR1cm5zOjwvQj48REQ+VGhlIG91dHB1dCBmb3JtYXQga2V5L3ZhbHVlIHBhaXJzIGluIHVzZS48L0RMPg0KPC9ERD4NCjwvREw+DQo8SFI+DQoNCjxBIE5BTUU9ImFzQ29udGVudEhhbmRsZXIoKSI+PCEtLSAtLT48L0E+PEgzPg0KYXNDb250ZW50SGFuZGxlcjwvSDM+DQo8UFJFPg0KcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy94bWwvc2F4L0NvbnRlbnRIYW5kbGVyLmh0bWwiPkNvbnRlbnRIYW5kbGVyPC9BPiA8Qj5hc0NvbnRlbnRIYW5kbGVyPC9CPigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb248L1BSRT4NCjxETD4NCjxERD5SZXR1cm4gYSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sIj48Q09ERT5Db250ZW50SGFuZGxlcjwvQ09ERT48L0E+IGludGVyZmFjZSB0byBwcm92aWRlIFNBWCBpbnB1dCB0by4KIFRocm91Z2ggdGhlIHJldHVybmVkIG9iamVjdCB0aGUgZG9jdW1lbnQgdG8gYmUgc2VyYWlsaXplZCwKIGFzIGEgc2VyaWVzIG9mIFNBWCBldmVudHMsIGNhbiBiZSBwcm92aWRlZCB0byB0aGUgc2VyaWFsemllci4KIElmIHRoZSBzZXJpYWxpemVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy94bWwvc2F4L0NvbnRlbnRIYW5kbGVyLmh0bWwiPjxDT0RFPkNvbnRlbnRIYW5kbGVyPC9DT0RFPjwvQT4KIGludGVyZmFjZSwgaXQgd2lsbCByZXR1cm4gbnVsbC4KIDxwPgogSW4gcHJpbmNpcGxlIG9ubHkgb25lIG9mIGFzRE9NU2VyaWFsaXplcigpIG9yIGFzQ29udGVudEhhbmRlcigpIAogc2hvdWxkIGJlIGNhbGxlZC48REQ+PERMPg0KPERUPjxCPlJldHVybnM6PC9CPjxERD5BIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy94bWwvc2F4L0NvbnRlbnRIYW5kbGVyLmh0bWwiPjxDT0RFPkNvbnRlbnRIYW5kbGVyPC9DT0RFPjwvQT4gaW50ZXJmYWNlIGludG8gdGhpcyBzZXJpYWxpemVyLAogIG9yIG51bGwgaWYgdGhlIHNlcmlhbGl6ZXIgaXMgbm90IFNBWCAyIGNhcGFibGU8RFQ+PEI+VGhyb3dzOjwvQj48REQ+amF2YS5pby5JT0V4Y2VwdGlvbiAtIEFuIEkvTyBleGNlcHRpb24gb2NjdXJlZDwvREw+DQo8L0REPg0KPC9ETD4NCjxIUj4NCg0KPEEgTkFNRT0iYXNET01TZXJpYWxpemVyKCkiPjwhLS0gLS0+PC9BPjxIMz4NCmFzRE9NU2VyaWFsaXplcjwvSDM+DQo8UFJFPg0KcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvRE9NU2VyaWFsaXplci5odG1sIj5ET01TZXJpYWxpemVyPC9BPiA8Qj5hc0RPTVNlcmlhbGl6ZXI8L0I+KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb248L1BSRT4NCjxETD4NCjxERD5SZXR1cm4gYSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL0RPTVNlcmlhbGl6ZXIuaHRtbCI+PENPREU+RE9NU2VyaWFsaXplcjwvQ09ERT48L0E+IGludGVyZmFjZSBpbnRvIHRoaXMgc2VyaWFsaXplci4KIFRocm91Z2ggdGhlIHJldHVybmVkIG9iamVjdCB0aGUgZG9jdW1lbnQgdG8gYmUgc2VyaWFsaXplZCwKIGEgRE9NLCBjYW4gYmUgcHJvdmlkZWQgdG8gdGhlIHNlcmlhbGl6ZXIuCiBJZiB0aGUgc2VyaWFsaXplciBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL0RPTVNlcmlhbGl6ZXIuaHRtbCI+PENPREU+RE9NU2VyaWFsaXplcjwvQ09ERT48L0E+CiBpbnRlcmZhY2UsIGl0IHNob3VsZCByZXR1cm4gbnVsbC4KIDxwPgogSW4gcHJpbmNpcGxlIG9ubHkgb25lIG9mIGFzRE9NU2VyaWFsaXplcigpIG9yIGFzQ29udGVudEhhbmRlcigpIAogc2hvdWxkIGJlIGNhbGxlZC48REQ+PERMPg0KPERUPjxCPlJldHVybnM6PC9CPjxERD5BIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvRE9NU2VyaWFsaXplci5odG1sIj48Q09ERT5ET01TZXJpYWxpemVyPC9DT0RFPjwvQT4gaW50ZXJmYWNlIGludG8gdGhpcyBzZXJpYWxpemVyLAogIG9yIG51bGwgaWYgdGhlIHNlcmlhbGl6ZXIgaXMgbm90IERPTSBjYXBhYmxlPERUPjxCPlRocm93czo8L0I+PEREPmphdmEuaW8uSU9FeGNlcHRpb24gLSBBbiBJL08gZXhjZXB0aW9uIG9jY3VyZWQ8L0RMPg0KPC9ERD4NCjwvREw+DQo8SFI+DQoNCjxBIE5BTUU9InJlc2V0KCkiPjwhLS0gLS0+PC9BPjxIMz4NCnJlc2V0PC9IMz4NCjxQUkU+DQpwdWJsaWMgYm9vbGVhbiA8Qj5yZXNldDwvQj4oKTwvUFJFPg0KPERMPg0KPEREPlRoaXMgbWV0aG9kIHJlc2V0cyB0aGUgc2VyaWFsaXplci4gCiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUsIHRoZQogc2VyaWFsaXplciBtYXkgYmUgdXNlZCBmb3Igc3Vic2VxdWVudCBzZXJpYWxpemF0aW9uIG9mIG5ldwogZG9jdW1lbnRzLiBJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIG91dHB1dCBmb3JtYXQgYW5kCiBvdXRwdXQgc3RyZWFtIHByaW9yIHRvIHNlcmlhbGl6aW5nLCBvciB0byByZXVzZSB0aGUgZXhpc3RpbmcKIG91dHB1dCBmb3JtYXQgYW5kIG91dHB1dCBzdHJlYW0gb3Igd3JpdGVyLjxERD48REw+DQo8RFQ+PEI+UmV0dXJuczo8L0I+PEREPlRydWUgaWYgc2VyaWFsaXplciBoYXMgYmVlbiByZXNldCBhbmQgY2FuIGJlIHJldXNlZDwvREw+DQo8L0REPg0KPC9ETD4NCjxIUj4NCg0KPEEgTkFNRT0iYXNET00zU2VyaWFsaXplcigpIj48IS0tIC0tPjwvQT48SDM+DQphc0RPTTNTZXJpYWxpemVyPC9IMz4NCjxQUkU+DQpwdWJsaWMgamF2YS5sYW5nLk9iamVjdCA8Qj5hc0RPTTNTZXJpYWxpemVyPC9CPigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjwvUFJFPg0KPERMPg0KPEREPlJldHVybiBhbiBPYmplY3QgaW50byB0aGlzIHNlcmlhbGl6ZXIgdG8gYmUgY2FzdCB0byBhIERPTTNTZXJpYWxpemVyLgogVGhyb3VnaCB0aGUgcmV0dXJuZWQgb2JqZWN0IHRoZSBkb2N1bWVudCB0byBiZSBzZXJpYWxpemVkLAogYSBET00gKExldmVsIDMpLCBjYW4gYmUgcHJvdmlkZWQgdG8gdGhlIHNlcmlhbGl6ZXIuCiBJZiB0aGUgc2VyaWFsaXplciBkb2VzIG5vdCBzdXBwb3J0IGNhc3RpbmcgdG8gYSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL0RPTTNTZXJpYWxpemVyLmh0bWwiPjxDT0RFPkRPTTNTZXJpYWxpemVyPC9DT0RFPjwvQT4KIGludGVyZmFjZSwgaXQgc2hvdWxkIHJldHVybiBudWxsLgogPHA+CiBJbiBwcmluY2lwbGUgb25seSBvbmUgb2YgYXNET00zU2VyaWFsaXplcigpIG9yIGFzQ29udGVudEhhbmRlcigpIAogc2hvdWxkIGJlIGNhbGxlZC48REQ+PERMPg0KPERUPjxCPlJldHVybnM6PC9CPjxERD5BbiBPYmplY3QgdG8gYmUgY2FzdCB0byBhIERPTTNTZXJpYWxpemVyIGludGVyZmFjZSBpbnRvIHRoaXMgc2VyaWFsaXplciwKICBvciBudWxsIGlmIHRoZSBzZXJpYWxpemVyIGlzIG5vdCBET00gY2FwYWJsZTxEVD48Qj5UaHJvd3M6PC9CPjxERD5qYXZhLmlvLklPRXhjZXB0aW9uIC0gQW4gSS9PIGV4Y2VwdGlvbiBvY2N1cmVkPC9ETD4NCjwvREQ+DQo8L0RMPg0KPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPg0KPEhSPg0KDQo8IS0tID09PT09PT09PT0gU1RBUlQgT0YgTkFWQkFSID09PT09PT09PT0gLS0+DQo8QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCI+DQo8VFI+DQo8VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+DQo8QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIj4NCiAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4NCiAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+DQogIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4NCiAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+DQogIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU2VyaWFsaXplci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+DQogIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4NCiAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPg0KICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXgtYWxsLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPg0KICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4NCiAgPC9UUj4NCjwvVEFCTEU+DQo8L1REPg0KPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+DQo8L0VNPg0KPC9URD4NCjwvVFI+DQoNCjxUUj4NCjxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+DQombmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyLmh0bWwiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOw0KJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemVyVHJhY2UuaHRtbCI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+DQo8VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPg0KICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sIiBUQVJHRVQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsNCiZuYnNwOzxBIEhSRUY9IlNlcmlhbGl6ZXIuaHRtbCIgVEFSR0VUPSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPjwvRk9OVD48L1REPg0KPC9UUj4NCjxUUj4NCjxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+DQogIFNVTU1BUlk6ICZuYnNwO0lOTkVSJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4NCjxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+DQpERVRBSUw6ICZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPg0KPC9UUj4NCjwvVEFCTEU+DQo8IS0tID09PT09PT09PT09IEVORCBPRiBOQVZCQVIgPT09PT09PT09PT0gLS0+DQoNCjxIUj4NCkNvcHlyaWdodCCpIDIwMDYgQXBhY2hlIFhNTCBQcm9qZWN0LiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KPC9CT0RZPg0KPC9IVE1MPg0K