PCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgoKPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KCiAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+CjxodG1sPgo8aGVhZD4KPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgo8dGl0bGU+TmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzPC90aXRsZT4KPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgo8IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgoKPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CgoKPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgoKPG1ldGEgY29udGVudD0ieW91ciBuYW1lIiBuYW1lPSJhdXRob3IiPgo8bWV0YSBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iIG5hbWU9ImRlc2NyaXB0aW9uIj4KPG1ldGEgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyIgbmFtZT0ia2V5d29yZHMiPgo8bWV0YSBjb250ZW50PSIxMC8yNS8wMiIgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIj4KPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgoKPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+CjxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CjwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KCjwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cjxib2R5Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KCjwvc2NyaXB0Pgo8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KPGgxPiBOYXZpZ2F0aW5nIFhNTCB3aXRoIEN1cnNvcnMgPC9oMT4KPGRpdiBpZD0idG9waWN0ZXh0Ij4KICA8cD5YTUwgY3Vyc29ycyBhcmUgYSB3YXkgdG8gbmF2aWdhdGUgdGhyb3VnaCBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQuIE9uY2UKICAgIHlvdSBsb2FkIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiBjcmVhdGUgYSBjdXJzb3IgdG8gcmVwcmVzZW50IGEgc3BlY2lmaWMKICAgIHBsYWNlIGluIHRoZSBYTUwuIEJlY2F1c2UgeW91IGNhbiB1c2UgYSBjdXJzb3Igd2l0aCBvciB3aXRob3V0IGEgc2NoZW1hIGNvcnJlc3BvbmRpbmcKICAgIHRvIHRoZSBYTUwsIGN1cnNvcnMgYXJlIGFuIGlkZWFsIHdheSB0byBoYW5kbGUgWE1MIHdpdGhvdXQgYSBzY2hlbWEuPC9wPgogIDxwPldpdGggYW4gWE1MIGN1cnNvciwgeW91IGNhbjo8L3A+CjwvZGl2Pgo8VUw+CiAgPGxpPgogICAgPGRpdj48YSBocmVmPSJjb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwiPlVzZSB0aGUgdG9rZW4gbW9kZWw8L2E+IHRvIG1vdmUKICAgICAgdGhyb3VnaCBYTUwgaW4gc21hbGwgaW5jcmVtZW50cywgb3IgaW4gYSBtYW5uZXIgc2ltaWxhciB0byB1c2luZyBhIERPTS1iYXNlZAogICAgICBtb2RlbC48L2Rpdj4KICA8TEk+CiAgICA8RElWPkdldCBhbmQgc2V0IHZhbHVlcyB3aXRoaW4gdGhlIFhNTC48L0RJVj4KICA8TEk+CiAgICA8RElWPjxhIGhyZWY9IiNhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyI+Q2hhbmdlIHRoZSBzdHJ1Y3R1cmU8L2E+IG9mIGFuCiAgICAgIFhNTCBkb2N1bWVudCBieSBpbnNlcnRpbmcsIHJlbW92aW5nLCBhbmQgbW92aW5nIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLjwvRElWPgogIDxMST4KICAgIDxESVY+PGEgaHJlZj0iY29uU2VsZWN0aW5nWE1Md2l0aFhRdWVyeVBhdGhYUGF0aC5odG1sIj5FeGVjdXRlIFhRdWVyeSBleHByZXNzaW9uczwvYT4KICAgICAgYWdhaW5zdCB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoZSBjdXJzb3IuPC9ESVY+CiAgPExJPgogICAgPERJVj48YSBocmVmPSJjb25Vc2luZ0Jvb2ttYXJrc1RvQW5ub3RhdGVYTUwuaHRtbCI+SW5zZXJ0IGJvb2ttYXJrczwvYT4gdG8KICAgICAgbWFyayBsb2NhdGlvbnMgaW4gWE1MLjwvRElWPgo8L1VMPgo8UD5XaGVuIHlvdSdyZSBmaW5pc2hlZCB1c2luZyBhIGN1cnNvciwgeW91ciBjb2RlIHNob3VsZCBjYWxsIGl0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZGlzcG9zZTwvc3Bhbj4KICBtZXRob2QuPC9QPgo8aDI+Q3JlYXRpbmcgYW5kIE1vdmluZyBhIEN1cnNvcjwvaDI+CjxQPldpdGggYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IGJvdW5kIHRvIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+WG1sT2JqZWN0PC9hPjwvc3Bhbj4KICAob3IgYSB0eXBlIGluaGVyaXRpbmcgZnJvbSBpdCksIHlvdSBjcmVhdGUgYSBuZXcgY3Vyc29yIGJ5IGNhbGxpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uZXdDdXJzb3I8L3NwYW4+CiAgbWV0aG9kLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj5YbWxDdXJzb3I8L2E+PC9zcGFuPgogIGludGVyZmFjZSByZXByZXNlbnRzIGEgY3Vyc29yLiBGcm9tIGEgY3Vyc29yIHN0YW5kcG9pbnQsIGFuIFhNTCBkb2N1bWVudCBpcwogIGEgY29sbGVjdGlvbiBvZiA8RU0+dG9rZW5zPC9FTT4gdGhhdCByZXByZXNlbnQgdGhlIGtpbmRzIG9mIHRoaW5ncyB0aGF0IGNhbgogIGFwcGVhciBpbiBYTUwuIFRoZXNlIGluY2x1ZGUmbmJzcDthdHRyaWJ1dGVzLCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBlbGVtZW50cywKICBjb21tZW50cywgYW5kIHNvIG9uLiZuYnNwO0VhY2ggcGllY2Ugb2YgaW5mb3JtYXRpb24gaW4gWE1MIGlzIHJlcHJlc2VudGVkIGJ5CiAgYSA8ZW0+dG9rZW4gdHlwZTwvZW0+LjwvUD4KPFAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEZvciBhIG1vcmUgY29tcGxldGUgZGVzY3JpcHRpb24gb2YKICBYTUwgdG9rZW5zLCBzZWUgPGEgaHJlZj0iY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIj5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L2E+LjwvUD4KPFA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBsb2FkcyB0aGUmbmJzcDtYTUwgaW5zdGFuY2UgZGVzY3JpYmVkIGFib3ZlCiAgZnJvbSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GaWxlPC9zcGFuPiBvYmplY3QsIHRoZW4gY3JlYXRlcyBhIG5ldyBjdXJzb3IuCiAgVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b0ZpcnN0Q2hpbGQ8L3NwYW4+IHRha2VzIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0CiAgdGFnIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+YmF0Y2hXaWRnZXRPcmRlcjwvc3Bhbj4gZG9jdW1lbnQgZWxlbWVudC4KICBUaGUgY29kZSB0aGVuIHByaW50cyB0aGUgdHlwZSBmb3IgdGhlIHRva2VuIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgYWxvbmcKICB3aXRoIHRoZSBYTUwgdGhlIGN1cnNvciByZXByZXNlbnRzl2luIG90aGVyIHdvcmRzLCA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPlRva2VuCiAgdHlwZTogU1RBUlQgLzwvc3Bhbj4gYW5kIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPmJhdGNoV2lkZ2V0T3JkZXJFbGVtZW50PC9zcGFuPgogIGFuZCBpdHMgY29udGVudHMuPC9QPgo8cHJlPnB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRDdXJzb3IoRmlsZSBvcmRlckZpbGUpIHRocm93cyBFeGNlcHRpb24KewogICAgQmF0Y2hXaWRnZXRPcmRlckRvY3VtZW50IHhtbERvYyA9IEJhdGNoV2lkZ2V0T3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKG9yZGVyRmlsZSk7CiAgICBYbWxDdXJzb3Igb3JkZXJDdXJzb3IgPSB4bWxEb2MubmV3Q3Vyc29yKCk7CiAgICBvcmRlckN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG9rZW4gdHlwZTogIiArIG9yZGVyQ3Vyc29yLmN1cnJlbnRUb2tlblR5cGUoKSArCiAgICAgICAgIiAvICIgKyBvcmRlckN1cnNvci54bWxUZXh0KCkpOwp9CjwvcHJlPgo8cCBjbGFzcz0ibm90ZXBhcmEiPjxTVFJPTkc+Tm90ZTwvU1RST05HPjogVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+CiAgaW50ZXJmYWNlIHByb3ZpZGVzIG1hbnkgbWV0aG9kcyB5b3UgY2FuIHVzZSB0byBwdXQgYSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgaXQuCiAgRm9yIGEgbGlzdCBvZiB0aG9zZSBtZXRob2RzLCBzZWUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPlhtbEN1cnNvcgogIEludGVyZmFjZTwvYT4uPC9wPgo8aDI+PGEgbmFtZT0iYWRkaW5nX2VsZW1lbnRzX2F0dHJpYnV0ZXMiIGlkPSJhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyI+PC9hPkFkZGluZwogIEVsZW1lbnRzIGFuZCBBdHRyaWJ1dGVzPC9oMj4KPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZSBwcm92aWRlcyBzZXZlcmFsIG1ldGhvZHMKICB5b3UgY2FuIHVzZSB0byBhZGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgdG8gWE1MLiA8L3A+CjxwPk9uZSB3YXkgdG8gYWRkIG5ldyBYTUwgaXMgd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJlZ2luRWxlbWVudDwvc3Bhbj4KICBtZXRob2QuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGluc2VydCBhIG5ldyBlbGVtZW50IGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiwKICBhbmQgZG8gaXQgc28gdGhlIGN1cnNvciBlbmRzIHVwIGJldHdlZW4gdGhlIG5ldyBlbGVtZW50J3MgU1RBUlQgYW5kIEVORCB0b2tlbnMuCiAgRnJvbSB0aGlzIHBvc2l0aW9uLCB5b3UgY2FuIGluc2VydCBhdHRyaWJ1dGVzICh0aGV5J3JlIGF1dG9tYXRpY2FsbHkgcGxhY2VkCiAgaW4gdGhlIHN0YXJ0IHRhZywgd2hlcmUgdGhleSBiZWxvbmcpIGFuZCBpbnNlcnQgYSB2YWx1ZS4gSGVyZSdzIGFuIGV4YW1wbGU6PC9wPgo8cHJlPgovLyBDcmVhdGUgYSBuZXcgY2h1bmsgb2YgWE1MLgpYbWxPYmplY3QgbmV3WG1sID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLyoKICogSW5zZXJ0IGEgbmV3IGN1cnNvciBhbmQgbW92ZSBpdCB0byB0aGUgZmlyc3QgU1RBUlQgdG9rZW4gKHdoZXJlIHRoZQogKiBYTUwgYWN0dWFsbHkgYmVnaW5zLgogKi8KWG1sQ3Vyc29yIGN1cnNvciA9IG5ld1htbC5uZXdDdXJzb3IoKTsKY3Vyc29yLnRvTmV4dFRva2VuKCk7Ci8vIEJlZ2luIGEgbmV3IGl0ZW0gZWxlbWVudCB3aG9zZSBuYW1lc3BhY2UgVVJJIGlzICJodHRwOi8vb3BlbnVyaS5vcmciLgpjdXJzb3IuYmVnaW5FbGVtZW50KCZxdW90O2l0ZW0mcXVvdDssICZxdW90O2h0dHA6Ly9vcGVudXJpLm9yZy8mcXVvdDspOwovLyBJbnNlcnQgYW4gSUQgYXR0cmlidXRlIG9uIHRoZSBpdGVtIGVsZW1lbnQsIGFsb25nIHdpdGggYW4gYXR0cmlidXRlIHZhbHVlLgpjdXJzb3IuaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCZxdW90O2lkJnF1b3Q7LCAmcXVvdDs0MDU2NDA0JnF1b3Q7KTsKLy8gSW5zZXJ0ICJiaWN5Y2xlIiBhcyBhbiBlbGVtZW50IHZhbHVlLgpjdXJzb3IuaW5zZXJ0Q2hhcnMoJnF1b3Q7YmljeWNsZSZxdW90Oyk7CmN1cnNvci5kaXNwb3NlKCk7CjwvcHJlPgo8cD5UaGlzIGV4YW1wbGUgcmVzdWx0cyBpbiBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD4KPHByZT4mbHQ7bnMxOml0ZW0gaWQ9JnF1b3Q7NDA1NjQwNCZxdW90OyB4bWxuczpuczE9JnF1b3Q7aHR0cDovL29wZW51cmkub3JnLyZxdW90OyZndDtiaWN5Y2xlJmx0Oy9uczE6aXRlbSZndDsKPC9wcmU+CjxoMj4gVXNpbmcgU3RvcmVkIEN1cnNvciBMb2NhdGlvbnMgd2l0aCBwdXNoKCkgYW5kIHBvcCgpPC9oMj4KPGRpdiBpZD0idG9waWN0ZXh0Ij4KICA8cD5XaGVuIHlvdSB3YW50IHRvIG1vdmUgYSBjdXJzb3IgYXJvdW5kLCBidXQgd2FudCB0byBrZWVwIHRyYWNrIG9mIGEgZm9ybWVyCiAgICBsb2NhdGlvbiwgeW91IGNhbiB1c2UgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+IGludGVyZmFjZSdzCiAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+CiAgICBtZXRob2RzLiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IG1ldGhvZCBwdXNoZXMgdGhlIGN1cnNvcidzCiAgICBjdXJyZW50IGxvY2F0aW9uIG9udG8gYSBzdGFjayBvZiBsb2NhdGlvbnMgbWFpbnRhaW5lZCBmb3IgdGhhdCBwYXJ0aWN1bGFyCiAgICBjdXJzb3I7IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiBtZXRob2QgcmVtb3ZlcyB0aGUgbG9jYXRpb24KICAgIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIG1vdmVzIHRoZSBjdXJzb3IgdG8gdGhhdCBsb2NhdGlvbi48L3A+CiAgPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgJmx0O2VtcGxveWVlJmd0OyBlbGVtZW50LCB1c2VkIGluIHRoZQogICAgZXhhbXBsZSBiZWxvdy48L3A+CiAgPHByZT4KJmx0O2VtcGxveWVlJmd0OwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bmFtZSZndDtHbGFkeXMgS3Jhdml0eiZsdDsvbmFtZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FkZHJlc3MgbG9jYXRpb249JnF1b3Q7aG9tZSZxdW90OyZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0cmVldCZndDsxMzEzIE1vY2tpbmdiaXJkIExhbmUmbHQ7L3N0cmVldCZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7U2VhdHRsZSZsdDsvY2l0eSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0YXRlJmd0O1dBJmx0Oy9zdGF0ZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3ppcCZndDs5ODExNSZsdDsvemlwJmd0OwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2FkZHJlc3MmZ3Q7CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthZGRyZXNzIGxvY2F0aW9uPSZxdW90O3dvcmsmcXVvdDsmZ3Q7CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdHJlZXQmZ3Q7MjAxMSAxNTJuZCBBdmVudWUgTkUmbHQ7L3N0cmVldCZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7UmVkbW9uZCZsdDsvY2l0eSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0YXRlJmd0O1dBJmx0Oy9zdGF0ZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3ppcCZndDs5ODA1MiZsdDsvemlwJmd0OwombmJzcDsmbmJzcDsgJm5ic3A7Jmx0Oy9hZGRyZXNzJmd0OwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGhvbmUgbG9jYXRpb249JnF1b3Q7d29yayZxdW90OyZndDsoNDI1KSA1NTUtNjg5NyZsdDsvcGhvbmUmZ3Q7CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwaG9uZSBsb2NhdGlvbj0mcXVvdDtob21lJnF1b3Q7Jmd0OygyMDYpIDU1NS02NTk0Jmx0Oy9waG9uZSZndDsKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O21vYmlsZSZxdW90OyZndDsoMjA2KSA1NTUtNzg5NCZsdDsvcGhvbmUmZ3Q7CiZsdDsvZW1wbG95ZWUmZ3Q7CjwvcHJlPgogIDxwPlRoZSBmb2xsb3dpbmcgSmF2YSBjb2RlIGlsbHVzdHJhdGVzIGhvdyB5b3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4KICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiB0byBwdXQgdGhlIGN1cnNvciBiYWNrIHRvIGEgc2F2ZWQKICAgIGxvY2F0aW9uIGFmdGVyIGEgYml0IG9mIHRyYXZlbGluZy48L3A+CiAgPHByZT4KLyoqCiAqIFBhc3MgdG8gdGhlIHRyeVNlbGVjdFBhdGggbWV0aG9kIGFuIFhtbE9iamVjdCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCiAqIHRoZSBYTUwgYWJvdmUuCiAqLwpwdWJsaWMgdm9pZCB0cnlTZWxlY3RQYXRoKFhtbE9iamVjdCB4bWwpCnsKICAgIC8qCiAgICAgKiBJbnNlcnRzIHRoZSBjdXJzb3IgYXQgdGhlIFNUQVJURE9DIHRva2VuICh0aGUgdmVyeSBiZWdpbm5pbmcsCiAgICAgKiBiZWZvcmUgYW55IGVsZW1lbnRzKS4KICAgICAqLwogICAgWG1sQ3Vyc29yIGN1cnNvciA9IHhtbC5uZXdDdXJzb3IoKTsKICAgIC8vIE1vdmVzIHRoZSBjdXJzb3IgdG8ganVzdCBiZWZvcmUgJmx0O2VtcGxveWVlJmd0OwogICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOwogICAgLy8gUHVzaGVzIHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uIG9udG8gdGhlIHN0YWNrLgogICAgY3Vyc29yLnB1c2goKTsKICAgIC8vIE1vdmVzIHRoZSBjdXJzb3IgdG8ganVzdCBiZWZvcmUgdGhlICZxdW90O3dvcmsmcXVvdDsgJmx0O3Bob25lJmd0OyBlbGVtZW50LgogICAgY3Vyc29yLnRvQ2hpbGQoMik7CiAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlIHRoZSAmcXVvdDtob21lJnF1b3Q7ICZsdDtwaG9uZSZndDsgZWxlbWVudC4KICAgIGN1cnNvci50b05leHRTaWJsaW5nKCk7CiAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIGJhY2sgdG8ganVzdCBiZWZvcmUgJmx0O2VtcGxveWVlJmd0OwogICAgY3Vyc29yLnBvcCgpOwp9CjwvcHJlPgogIDxwPk9mIGNvdXJzZSwgeW91IGNhbiBjYWxsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4KICAgIG11bHRpcGxlIHRpbWVzLiBFYWNoIG5ldyBjYWxsIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4KICAgIG1ldGhvZCBwdXNoZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb250byB0aGUgc3RhY2suIEFzIHlvdSBjYWxsIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPgogICAgbWV0aG9kLCB5b3UncmUgYWx3YXlzIGdldHRpbmcgd2hhdCdzIG9uIHRvcCBvZiB0aGUgc3RhY2suIFNvIGlmIHlvdSBjYWxsZWQKICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiB0aHJlZSB0aW1lcyBiZWZvcmUgY2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPgogICAgJiM4MjEyOyAxLCAyLCAzICYjODIxMjsgY2FsbGluZyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiB0aHJlZQogICAgdGltZXMgd291bGQgZ2V0IHRob3NlIGxvY2F0aW9ucyBpbiByZXZlcnNlIG9yZGVyICYjODIxMjsgMywgMiwgMS48L3A+CiAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4KICAgIG1ldGhvZHMgY2FuIGJlIGhhbmR5IGFzIGFuIGFsdGVybmF0aXZlIHRvIGNyZWF0aW5nIG5ldyBjdXJzb3JzIHRoYXQgYXJlIGRlc2lnbmVkCiAgICBzaW1wbHkgdG8gbWFyayBhIHBhcnRpY3VsYXIgbG9jYXRpb24gd2hpbGUgeW91IG1vdmUgYW5vdGhlciBjdXJzb3IgYXJvdW5kLgogICAgVGhlIHJlc291cmNlcyByZXF1aXJlZCB0byBtYWludGFpbiBhIGxvY2F0aW9uIHN0YWNrIHRocm91Z2ggPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+CiAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gYXJlIGZhciBsZXNzIHRoYW4gdGhvc2UgbmVlZGVkIGJ5CiAgICBjdXJzb3JzLiA8L3A+CiAgPEgxPkRpc3Bvc2luZyBvZiBhIEN1cnNvcjwvSDE+CiAgPHA+V2hlbiB5b3UncmUgdGhyb3VnaCB3aXRoIGEgY3Vyc29yLCB5b3VyIGNvZGUgc2hvdWxkIGNhbGwgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kaXNwb3NlPC9zcGFuPgogICAgbWV0aG9kIHRvIGluZGljYXRlIHRoYXQgaXQncyBubyBsb25nZXIgbmVlZGVkLjwvcD4KICA8cCBjbGFzcz0icmVsYXRlZHRvcGljcyI+UmVsYXRlZCBUb3BpY3M8L3A+CiAgPHA+PGEgaHJlZj0iY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIj5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L2E+PC9wPgogIDxwPjxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPjwvcD4KPC9kaXY+CjwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Cgo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==