PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KPHRpdGxlPlV1aWQgTGlicmFyeTwvdGl0bGU+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICBwcmUgeyBtYXJnaW46IDFlbTsgcGFkZGluZzogMWVtOyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyB9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CjxoMT48aW1nIHNyYz0iLi4vLi4vYm9vc3QucG5nIiBhbHQ9IkJvb3N0IiBXSURUSD0iMjc3IiBIRUlHSFQ9Ijg2Ij5VdWlkPC9oMT4KCjxoMj48YSBuYW1lPSJDb250ZW50cyI+Q29udGVudHM8L2E+PC9oMj4KCjxvbD4KICAgIDxsaT48YSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjRXhhbXBsZXMiPkV4YW1wbGVzPC9hPjwvbGk+CiAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNUYWdnaW5nIj5UYWdnaW5nPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNQT0QgRWZmaWNpZW5jaWVzIj5QT0QgRWZmaWNpZW5jaWVzPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNCeXRlIEV4dHJhY3Rpb24iPkJ5dGUgRXh0cmFjdGlvbjwvYT48L2xpPgogICAgPC91bAogICAgPGxpPjxhIGhyZWY9IiNSZWZlcmVuY2UiPlJlZmVyZW5jZTwvYT48L2xpPgogICAgPHVsPgogICAgICAgIDxsaT48YSBocmVmPSIjYm9vc3QvdXVpZC91dWlkLmhwcCI+Ym9vc3QvdXVpZC91dWlkLmhwcDwvYT48L2xpPgogICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTeW5vcHNpcyI+U3lub3BzaXM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTaXplIj5TaXplPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSIjSXRlcmF0aW9uIj5JdGVyYXRpb248L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNOaWwiPk5pbCB1dWlkPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSIjVmFyaWFudCI+VmFyaWFudDwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iI1ZlcnNpb24iPlZlcnNpb248L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTd2FwIj5Td2FwPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSIjT3BlcmF0b3JzIj5PcGVyYXRvcnM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNIYXNoIj5IYXNoPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgICA8bGk+PGEgaHJlZj0iI2Jvb3N0L3V1aWQvdXVpZF9nZW5lcmF0b3JzLmhwcCI+Ym9vc3QvdXVpZC91dWlkX2dlbmVyYXRvcnMuaHBwPC9hPjwvbGk+CiAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iI1N5bm9wc2lzX2dlbmVyYXRvcnMiPlN5bm9wc2lzPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgICA8bGk+PGEgaHJlZj0iI2Jvb3N0L3V1aWQvbmlsX2dlbmVyYXRvci5ocHAiPmJvb3N0L3V1aWQvbmlsX2dlbmVyYXRvci5ocHA8L2E+PC9saT4KICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSIjU3lub3BzaXNfbmlsX2dlbmVyYXRvciI+U3lub3BzaXM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNOaWwgR2VuZXJhdG9yIj5OaWwgR2VuZXJhdG9yPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgICA8bGk+PGEgaHJlZj0iI2Jvb3N0L3V1aWQvc3RyaW5nX2dlbmVyYXRvci5ocHAiPmJvb3N0L3V1aWQvc3RyaW5nX2dlbmVyYXRvci5ocHA8L2E+PC9saT4KICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSIjU3lub3BzaXNfc3RyaW5nX2dlbmVyYXRvciI+U3lub3BzaXM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTdHJpbmcgR2VuZXJhdG9yIj5TdHJpbmcgR2VuZXJhdG9yPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgICA8bGk+PGEgaHJlZj0iI2Jvb3N0L3V1aWQvbmFtZV9nZW5lcmF0b3IuaHBwIj5ib29zdC91dWlkL25hbWVfZ2VuZXJhdG9yLmhwcDwvYT48L2xpPgogICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTeW5vcHNpc19uYW1lX2dlbmVyYXRvciI+U3lub3BzaXM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNOYW1lIEdlbmVyYXRvciI+TmFtZSBHZW5lcmF0b3I8L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICAgIDxsaT48YSBocmVmPSIjYm9vc3QvdXVpZC9yYW5kb21fZ2VuZXJhdG9yLmhwcCI+Ym9vc3QvdXVpZC9yYW5kb21fZ2VuZXJhdG9yLmhwcDwvYT48L2xpPgogICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTeW5vcHNpc19yYW5kb21fZ2VuZXJhdG9yIj5TeW5vcHNpczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iI1JhbmRvbSBHZW5lcmF0b3IiPlJhbmRvbSBHZW5lcmF0b3I8L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICAgIDxsaT48YSBocmVmPSIjYm9vc3QvdXVpZC91dWlkX2lvLmhwcCI+Ym9vc3QvdXVpZC91dWlkX2lvLmhwcDwvYT48L2xpPgogICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTeW5vcHNpc19pbyI+U3lub3BzaXM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTdHJlYW1fb3BlcmF0b3JzIj5TdHJlYW0gT3BlcmF0b3JzPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSIjdG9fc3RyaW5nIj5UbyBTdHJpbmc8L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICAgIDxsaT48YSBocmVmPSIjYm9vc3QvdXVpZC91dWlkX3NlcmlhbGl6ZS5ocHAiPmJvb3N0L3V1aWQvdXVpZF9zZXJpYWxpemUuaHBwPC9hPjwvbGk+CiAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iI1N5bm9wc2lzX3NlcmlhbGl6ZSI+U3lub3BzaXM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNTZXJpYWxpemF0aW9uIj5TZXJpYWxpemF0aW9uPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvdWw+CiAgICA8bGk+PGEgaHJlZj0iI0Rlc2lnbiBub3RlcyI+RGVzaWduIG5vdGVzPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI0hpc3RvcnkgYW5kIEFja25vd2xlZGdlbWVudHMiPkhpc3RvcnkgYW5kIEFja25vd2xlZGdlbWVudHM8L2E+PC9saT4KPC9vbD4KCjxoMj48YSBuYW1lPSJJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2gyPgo8cD4KQSBVVUlELCBvciBVbml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciwgaXMgaW50ZW5kZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkKaW5mb3JtYXRpb24gaW4gYSBkaXN0cmlidXRlZCBlbnZpcm9ubWVudCB3aXRob3V0IHNpZ25pZmljYW50IGNlbnRyYWwKY29vcmRpbmF0aW9uLiAgSXQgY2FuIGJlIHVzZWQgdG8gdGFnIG9iamVjdHMgd2l0aCB2ZXJ5IHNob3J0IGxpZmV0aW1lcywgb3IgCnRvIHJlbGlhYmx5IGlkZW50aWZ5IHZlcnkgcGVyc2lzdGVudCBvYmplY3RzIGFjcm9zcyBhIG5ldHdvcmsuCjxwPgpVVUlEcyBoYXZlIG1hbnkgYXBwbGljYXRpb25zLiAgU29tZSBleGFtcGxlcyBmb2xsb3c6ICBEYXRhYmFzZXMgbWF5IHVzZSBVVUlEcyAKdG8gaWRlbnRpZnkgcm93cyBvciByZWNvcmRzIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIHVuaXF1ZSBhY3Jvc3MgCmRpZmZlcmVudCBkYXRhYmFzZXMsIG9yIGZvciBwdWJsaWNhdGlvbi9zdWJzY3JpcHRpb24gc2VydmljZXMuICBOZXR3b3JrIG1lc3NhZ2VzCm1heSBiZSBpZGVudGlmaWVkIHdpdGggYSBVVUlEIHRvIGVuc3VyZSB0aGF0IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1lc3NhZ2UgYXJlIHB1dCAKYmFjayB0b2dldGhlciBhZ2Fpbi4gIERpc3RyaWJ1dGVkIGNvbXB1dGluZyBtYXkgdXNlIFVVSURzIHRvIGlkZW50aWZ5IGEgcmVtb3RlIApwcm9jZWR1cmUgY2FsbC4gIFRyYW5zYWN0aW9ucyBhbmQgY2xhc3NlcyBpbnZvbHZlZCBpbiBzZXJpYWxpemF0aW9uIG1heSBiZQppZGVudGlmaWVkIGJ5IFVVSURzLiAgTWljcm9zb2Z0J3MgY29tcG9uZW50IG9iamVjdCBtb2RlbCAoQ09NKSB1c2VzIFVVSURzIHRvIApkaXN0aW5ndWlzaCBkaWZmZXJlbnQgc29mdHdhcmUgY29tcG9uZW50IGludGVyZmFjZXMuICBVVUlEcyBhcmUgaW5zZXJ0ZWQgaW50byAKZG9jdW1lbnRzIGZyb20gTWljcm9zb2Z0IE9mZmljZSBwcm9ncmFtcy4gIFVVSURzIGlkZW50aWZ5IGF1ZGlvIG9yIAp2aWRlbyBzdHJlYW1zIGluIHRoZSBBZHZhbmNlZCBTeXN0ZW1zIEZvcm1hdCAoQVNGKS4gIFVVSURzIGFyZSBhbHNvIGEgYmFzaXMgCmZvciBPSURzIChvYmplY3QgaWRlbnRpZmllcnMpLCBhbmQgVVJOcyAodW5pZm9ybSByZXNvdXJjZSBuYW1lKS4KCjxwPgpBbiBhdHRyYWN0aXZlIGZlYXR1cmUgb2YgVVVJRHMgd2hlbiBjb21wYXJlZCB0byBhbHRlcm5hdGl2ZXMgaXMgdGhlaXIgcmVsYXRpdmUgCnNtYWxsIHNpemUsIG9mIDEyOC1iaXRzLCBvciAxNi1ieXRlcy4gIEFub3RoZXIgaXMgdGhhdCB0aGUgY3JlYXRpb24gb2YgVVVJRHMgCmRvZXMgbm90IHJlcXVpcmUgYSBjZW50cmFsaXplZCBhdXRob3JpdHkuCgo8cD5XaGVuIFVVSURzIGFyZSBnZW5lcmF0ZWQgYnkgb25lIG9mIHRoZSBkZWZpbmVkCm1lY2hhbmlzbXMsIHRoZXkgYXJlIGVpdGhlciBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSwgZGlmZmVyZW50IGZyb20gYWxsIG90aGVyCmdlbmVyYXRlZCBVVUlEcyAodGhhdCBpcywgaXQgaGFzIG5ldmVyIGJlZW4gZ2VuZXJhdGVkIGJlZm9yZSBhbmQgaXQgd2lsbApuZXZlciBiZSBnZW5lcmF0ZWQgYWdhaW4pLCBvciBpdCBpcyBleHRyZW1lbHkgbGlrZWx5IHRvIGJlIHVuaXF1ZSAoZGVwZW5kaW5nCm9uIHRoZSBtZWNoYW5pc20pLgoKPGgyPjxhIG5hbWU9IkV4YW1wbGVzIj5FeGFtcGxlczwvYT48L2gyPgo8aDM+PGEgbmFtZT0iVGFnZ2luZyI+VGFnZ2luZzwvYT48L2gzPgo8cHJlPgovLyBleGFtcGxlIG9mIHRhZ2dpbmcgYW4gb2JqZWN0IHdpdGggYSB1dWlkCi8vIHNlZSA8YSBocmVmPSIuL3Rlc3QvdGVzdF90YWdnaW5nLmNwcCI+PHR0PmJvb3N0L2xpYnMvdXVpZC90ZXN0L3Rlc3RfdGFnZ2luZy5jcHA8L3R0PjwvYT4KCiNpbmNsdWRlICZsdDs8YSBocmVmPSIuLy4uLy4uL2Jvb3N0L3V1aWQvdXVpZC5ocHAiPjx0dD5ib29zdC91dWlkL3V1aWQuaHBwPC90dD48L2E+Jmd0OwojaW5jbHVkZSAmbHQ7PGEgaHJlZj0iLi8uLi8uLi9ib29zdC91dWlkL3V1aWRfZ2VuZXJhdG9ycy5ocHAiPjx0dD5ib29zdC91dWlkL3V1aWRfZ2VuZXJhdG9ycy5ocHA8L3R0PjwvYT4mZ3Q7CgpjbGFzcyBvYmplY3QKewpwdWJsaWM6CiAgICBvYmplY3QoKQogICAgICAgIDogdGFnKGJvb3N0Ojp1dWlkczo6cmFuZG9tX2dlbmVyYXRvcigpKCkpCiAgICAgICAgLCBzdGF0ZSgwKQogICAge30KICAgIAogICAgZXhwbGljaXQgb2JqZWN0KGludCBzdGF0ZSkKICAgICAgICA6IHRhZyhib29zdDo6dXVpZHM6OnJhbmRvbV9nZW5lcmF0b3IoKSgpKQogICAgICAgICwgc3RhdGUoc3RhdGUpCiAgICB7fQogICAgCiAgICBvYmplY3Qob2JqZWN0IGNvbnN0JmFtcDsgcmhzKQogICAgICAgIDogdGFnKHJocy50YWcpCiAgICAgICAgLCBzdGF0ZShyaHMuc3RhdGUpCiAgICB7fQogICAgCiAgICBib29sIG9wZXJhdG9yPT0ob2JqZWN0IGNvbnN0JmFtcDsgcmhzKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHRhZyA9PSByaHMudGFnOwogICAgfQogICAgCiAgICBvYmplY3QmYW1wOyBvcGVyYXRvcj0ob2JqZWN0IGNvbnN0JmFtcDsgcmhzKSB7CiAgICAgICAgdGFnID0gcmhzLnRhZzsKICAgICAgICBzdGF0ZSA9IHJocy5zdGF0ZTsKICAgIH0KICAgIAogICAgaW50IGdldF9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlOyB9CiAgICB2b2lkIHNldF9zdGF0ZShpbnQgbmV3X3N0YXRlKSB7IHN0YXRlID0gbmV3X3N0YXRlOyB9CiAgICAKcHJpdmF0ZToKICAgIGJvb3N0Ojp1dWlkczo6dXVpZCB0YWc7CiAgICAKICAgIGludCBzdGF0ZTsKfTsKCm9iamVjdCBvMSgxKTsKb2JqZWN0IG8yID0gbzE7Cm8yLnNldF9zdGF0ZSgyKTsKYXNzZXJ0KG8xID09IG8yKTsKCm9iamVjdCBvMygzKTsKYXNzZXJ0KG8xICE9IG8zKTsKYXNzZXJ0KG8yICE9IG8zKTsKPC9wcmU+Cgo8aDM+PGEgbmFtZT0iUE9EIEVmZmljaWVuY2llcyI+UE9EIEVmZmljaWVuY2llczwvYT48L2gzPgo8cD4KVGhpcyBsaWJyYXJ5IGltcGxlbWVudHMgYSBVVUlEIGFzIGEgUE9EIGFsbG93aW5nIGEgVVVJRAp0byBiZSB1c2VkIGluIHRoZSBtb3N0IGVmZmljaWVudCB3YXlzLCBpbmNsdWRpbmcgdXNpbmcgbWVtY3B5LCAKYW5kIGFnZ3JlZ2F0ZSBpbml0aWFsaXplcnMuICBBIGRyYXdiYWNrIGlzIHRoYXQgYSBQT0QgY2FuIApub3QgaGF2ZSBhbnkgY29uc3RydWN0b3JzLCBhbmQgdGh1cyBkZWNsYXJpbmcgYSBVVUlEIHdpbGwgbm90IAppbml0aWFsaXplIGl0IHRvIGEgdmFsdWUgZ2VuZXJhdGVkIGJ5IG9uZSBvZiB0aGUgZGVmaW5lZCAKbWVjaGFuaXNtcy4gIEJ1dCBhIGNsYXNzIGJhc2VkIG9uIGEgVVVJRCBjYW4gYmUgZGVmaW5lZCAKdGhhdCBkb2VzIGluaXRpYWxpemUgaXRzZWxmIHRvIGEgdmFsdWUgZ2VuZXJhdGVkIGJ5IG9uZSBvZiAKdGhlIGRlZmluZWQgbWVjaGFuaXNtcy4KPHA+Ck5vdGUgdGhhdCA8dHQ+Ym9vc3Q6OmlzX3BvZDwvdHQ+IGlzIHNwZWNpYWxpemVkIGZvciA8dHQ+Ym9vc3Q6OnV1aWRzOjp1dWlkPC90dD4KYW5kIGRlcGVuZHMgb24gPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy90eXBlX3RyYWl0cyI+Qm9vc3QuVHlwZVRyYWl0czwvYT4uCkRlZmluZSA8dHQ+Qk9PU1RfVVVJRF9OT19UWVBFX1RSQUlUUzwvdHQ+IGJlZm9yZSBpbmNsdWRpbmcgPGEgaHJlZj0iLi8uLi8uLi9ib29zdC91dWlkL3V1aWQuaHBwIj48dHQ+Ym9vc3QvdXVpZC91dWlkLmhwcDwvdHQ+PC9hPgp0byByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy90eXBlX3RyYWl0cyI+Qm9vc3QuVHlwZVRyYWl0czwvYT4uCjxwcmU+Ci8vIGV4YW1wbGUgdXNpbmcgbWVtY3B5IGFuZCBhZ2dyZWdhdGUgaW5pdGlhbGl6ZXJzCi8vIGV4YW1wbGUgb2YgYSBjbGFzcyB1dWlkIHNlZSA8YSBocmVmPSIuL3Rlc3QvdGVzdF91dWlkX2NsYXNzLmNwcCI+PHR0PmJvb3N0L2xpYnMvdXVpZC90ZXN0L3Rlc3RfdXVpZF9jbGFzcy5jcHA8L3R0PjwvYT4KCiNpbmNsdWRlICZsdDs8YSBocmVmPSIuLy4uLy4uL2Jvb3N0L3V1aWQvdXVpZC5ocHAiPjx0dD5ib29zdC91dWlkL3V1aWQuaHBwPC90dD48L2E+Jmd0OwojaW5jbHVkZSAmbHQ7PGEgaHJlZj0iLi8uLi8uLi9ib29zdC91dWlkL3V1aWRfZ2VuZXJhdG9ycy5ocHAiPjx0dD5ib29zdC91dWlkL3V1aWRfZ2VuZXJhdG9ycy5ocHA8L3R0PjwvYT4mZ3Q7Cgp7IC8vIGV4YW1wbGUgdXNpbmcgbWVtY3B5CiAgICB1bnNpZ25lZCBjaGFyIHV1aWRfZGF0YVsxNl07CiAgICAvLyBmaWxsIHV1aWRfZGF0YQoKICAgIGJvb3N0Ojp1dWlkczo6dXVpZCB1OwoKICAgIG1lbWNweSgmYW1wO3UsIHV1aWRfZGF0YSwgMTYpOwp9Cgp7IC8vIGV4YW1wbGUgdXNpbmcgYWdncmVnYXRlIGluaXRpYWxpemVycwogICAgYm9vc3Q6OnV1aWRzOjp1dWlkIHUgPQogICAgeyAweDEyICwweDM0LCAweDU2LCAweDc4CiAgICAsIDB4OTAsIDB4YWIKICAgICwgMHhjZCwgMHhlZgogICAgLCAweDEyLCAweDM0CiAgICAsIDB4NTYsIDB4NzgsIDB4OTAsIDB4YWIsIDB4Y2QsIDB4ZWYKICAgIH07Cn0KCi8vIGV4YW1wbGUgb2YgY3JlYXRpbmcgYSB1dWlkIGNsYXNzIHRoYXQKLy8gaW5pdGlhbGl6ZXMgdGhlIHV1aWQgaW4gdGhlIGNvbnN0cnVjdG9yCi8vIHVzaW5nIGEgZGVmaW5lZCBtZWNoYW5pc20KCmNsYXNzIHV1aWRfY2xhc3MgOiBwdWJsaWMgYm9vc3Q6OnV1aWRzOjp1dWlkCnsKcHVibGljOgogICAgdXVpZF9jbGFzcygpCiAgICAgICAgOiBib29zdDo6dXVpZHM6OnV1aWQoYm9vc3Q6OnV1aWRzOjpyYW5kb21fZ2VuZXJhdG9yKCkoKSkKICAgIHt9CiAgICAKICAgIGV4cGxpY2l0IHV1aWRfY2xhc3MoYm9vc3Q6OnV1aWRzOjp1dWlkIGNvbnN0JmFtcDsgdSkKICAgICAgICA6IGJvb3N0Ojp1dWlkczo6dXVpZCh1KQogICAge30KCiAgICBvcGVyYXRvciBib29zdDo6dXVpZHM6OnV1aWQoKSB7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0Jmx0O2Jvb3N0Ojp1dWlkczo6dXVpZCZhbXA7Jmd0OygqdGhpcyk7CiAgICB9CgogICAgb3BlcmF0b3IgYm9vc3Q6OnV1aWRzOjp1dWlkKCkgY29uc3QgewogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCZsdDtib29zdDo6dXVpZHM6OnV1aWQgY29uc3QmYW1wOyZndDsoKnRoaXMpOwogICAgfQp9OwoKdXVpZF9jbGFzcyB1MTsKdXVpZF9jbGFzcyB1MjsKCmFzc2VydCh1MSAhPSB1Mik7CjwvcHJlPgoKPGgzPjxhIG5hbWU9IkJ5dGUgRXh0cmFjdGlvbiI+Qnl0ZSBFeHRyYWN0aW9uPC9hPjwvaDM+CjxwPkl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gZ2V0IGF0IHRoZSAxNiBieXRlcyBvZiBhIDxiPnV1aWQ8L2I+IGRpcmVjdGx5LiAgClR5cGljYWwgdXNlIGlzIGFzIGZvbGxvd3M6Cgo8cHJlPgpib29zdDo6dXVpZHM6OnV1aWQgdTsKc3RkOjp2ZWN0b3ImbHQ7Y2hhciZndDsgdih1LnNpemUoKSk7CnN0ZDo6Y29weSh1LmJlZ2luKCksIHUuZW5kKCksIHYuYmVnaW4oKSk7CjwvcHJlPgoKPHA+Tm90ZTogPHR0PmJvb3N0Ojp1dWlkczo6dXVpZDo6c2l6ZSgpPC90dD4gYWx3YXlzIHJldHVybnMgMTYuCgo8aDI+PGEgbmFtZT0iUmVmZXJlbmNlIj5SZWZlcmVuY2U8L2E+PC9oMj4KPGgzPjxhIG5hbWU9ImJvb3N0L3V1aWQvdXVpZC5ocHAiIGhyZWY9Ii4vLi4vLi4vYm9vc3QvdXVpZC91dWlkLmhwcCI+Ym9vc3QvdXVpZC91dWlkLmhwcDwvYT48L2gzPgo8aDQ+PGEgbmFtZT0iU3lub3BzaXMiPlN5bm9wc2lzPC9hPjwvaDQ+CjxwcmU+Cm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSB1dWlkcyB7CgpjbGFzcyB1dWlkIHsKcHVibGljOgogICAgdHlwZWRlZiB1aW50OF90IHZhbHVlX3R5cGU7CiAgICB0eXBlZGVmIHVpbnQ4X3QmYW1wOyByZWZlcmVuY2U7CiAgICB0eXBlZGVmIHVpbnQ4X3QgY29uc3QmYW1wOyBjb25zdF9yZWZlcmVuY2U7CiAgICB0eXBlZGVmIHVpbnQ4X3QqIGl0ZXJhdG9yOwogICAgdHlwZWRlZiB1aW50OF90IGNvbnN0KiBjb25zdF9pdGVyYXRvcjsKICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOwogICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CgogICAgc3RhdGljIHNpemVfdHlwZSBzdGF0aWNfc2l6ZSgpOwoKICAgIC8vIGl0ZXJhdGlvbgogICAgaXRlcmF0b3IgYmVnaW4oKTsKICAgIGl0ZXJhdG9yIGVuZCgpOwogICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OwoKICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3Q7CgogICAgYm9vbCBpc19uaWwoKSBjb25zdDsKICAgIAogICAgZW51bSB2YXJpYW50X3R5cGUgewogICAgICAgIHZhcmlhbnRfbmNzLCAvLyBOQ1MgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHZhcmlhbnRfcmZjXzQxMjIsIC8vIGRlZmluZWQgaW4gUkZDIDQxMjIgZG9jdW1lbnQKICAgICAgICB2YXJpYW50X21pY3Jvc29mdCwgLy8gTWljcm9zb2Z0IENvcnBvcmF0aW9uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB2YXJpYW50X2Z1dHVyZSAvLyBmdXR1cmUgZGVmaW5pdGlvbgogICAgfTsKICAgIHZhcmlhbnRfdHlwZSB2YXJpYW50KCkgY29uc3Q7CgogICAgZW51bSB2ZXJzaW9uX3R5cGUgewogICAgICAgIHZlcnNpb25fdW5rbm93biA9IC0xLAogICAgICAgIHZlcnNpb25fdGltZV9iYXNlZCA9IDEsCiAgICAgICAgdmVyc2lvbl9kY2Vfc2VjdXJpdHkgPSAyLAogICAgICAgIHZlcnNpb25fbmFtZV9iYXNlZF9tZDUgPSAzLAogICAgICAgIHZlcnNpb25fcmFuZG9tX251bWJlcl9iYXNlZCA9IDQsCiAgICAgICAgdmVyc2lvbl9uYW1lX2Jhc2VkX3NoYTEgPSA1CiAgICB9OwogICAgdmVyc2lvbl90eXBlIHZlcnNpb24oKSBjb25zdDsKCiAgICAvLyBTd2FwIGZ1bmN0aW9uCiAgICB2b2lkIHN3YXAodXVpZCZhbXA7IHJocyk7CgogICAgdWludDhfdCBkYXRhW3N0YXRpY19zaXplKCldOwp9OwoKLy8gc3RhbmRhcmQgb3BlcmF0b3JzCmJvb2wgb3BlcmF0b3I9PSh1dWlkIGNvbnN0JmFtcDsgbGhzLCB1dWlkIGNvbnN0JmFtcDsgcmhzKTsKYm9vbCBvcGVyYXRvciE9KHV1aWQgY29uc3QmYW1wOyBsaHMsIHV1aWQgY29uc3QmYW1wOyByaHMpOwpib29sIG9wZXJhdG9yJmx0Oyh1dWlkIGNvbnN0JmFtcDsgbGhzLCB1dWlkIGNvbnN0JmFtcDsgcmhzKTsKYm9vbCBvcGVyYXRvciZndDsodXVpZCBjb25zdCZhbXA7IGxocywgdXVpZCBjb25zdCZhbXA7IHJocyk7CmJvb2wgb3BlcmF0b3ImbHQ7PSh1dWlkIGNvbnN0JmFtcDsgbGhzLCB1dWlkIGNvbnN0JmFtcDsgcmhzKTsKYm9vbCBvcGVyYXRvciZndDs9KHV1aWQgY29uc3QmYW1wOyBsaHMsIHV1aWQgY29uc3QmYW1wOyByaHMpOwoKdm9pZCBzd2FwKHV1aWQmYW1wOyBsaHMsIHV1aWQmYW1wOyByaHMpOwoKc3RkOjpzaXplX3QgaGFzaF92YWx1ZSh1dWlkIGNvbnN0JmFtcDsgdSk7Cgp9fSAvLyBuYW1lc3BhY2UgYm9vc3Q6OnV1aWRzCjwvcHJlPgoKPGg0PjxhIG5hbWU9IlNpemUiPlNpemU8L2E+PC9oND4KCjxwPlRoZSBzaXplIG9mIGEgPGI+dXVpZDwvYj4gKGluIGJ5dGVzKSBjYW4gYmUgb2J0YWluZWQgZWl0aGVyIGJ5CmNhbGxpbmcgdGhlIGZ1bmN0aW9uIDx0dD5ib29zdDo6dXVpZHM6OnV1aWQ6OnNpemUoKTwvdHQ+IG9yIGJ5IApjYWxsaW5nIHRoZSBzdGF0aWMgZnVuY3Rpb24gPHR0PmJvb3N0Ojp1dWlkczo6dXVpZDo6c3RhdGljX3NpemUoKTwvdHQ+LCAKYm90aCBhbHdheXMgcmV0dXJuIDE2Lgo8cHJlPgogICAgYm9vc3Q6OnV1aWRzOjp1dWlkIHU7CiAgICBhc3NlcnQoMTYgPT0gdS5zaXplKCkpOwogICAgYXNzZXJ0KDE2ID09IGJvb3N0Ojp1dWlkczo6dXVpZDo6c3RhdGljX3NpemUoKSk7CjwvcHJlPgoKPGg0PjxhIG5hbWU9Ikl0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPjwvaDQ+Cgo8cD5Cb3RoIGl0ZXJhdG9ycyBhbmQgY29uc3RhbnQgaXRlcmF0b3JzIGFyZSBwcm92aWRlZC4KPHByZT4KICAgIGJvb3N0Ojp1dWlkczo6dXVpZCB1OwogICAgZm9yIChib29zdDo6dXVpZHM6OnV1aWQ6OmNvbnN0X2l0ZXJhdG9yIGl0PXUuYmVnaW4oKTsgaXQhPXUuZW5kKCk7ICsraXQpIHsKICAgICAgICBib29zdDo6dXVpZHM6OnV1aWQ6OnZhbHVlX3R5cGUgdiA9ICppdDsKICAgIH0KICAgIGZvciAoYm9vc3Q6OnV1aWRzOjp1dWlkOjppdGVyYXRvciBpdD11LmJlZ2luKCk7IGl0IT11LmVuZCgpOyArK2l0KSB7CiAgICAgICAgKml0ID0gMDsKICAgIH0KPC9wcmU+Cgo8aDQ+PGEgbmFtZT0iTmlsIj5OaWwgdXVpZDwvYT48L2g0Pgo8cD5UaGUgZnVuY3Rpb24sIDx0dD5ib29zdDo6dXVpZHM6OnV1aWQ6OmlzX251bGwoKTwvdHQ+IHJldHVybnMgdHJ1ZSBpZiBhbmQKb25seSBpZiB0aGUgPGI+dXVpZDwvYj4gaXMgZXF1YWwgdG8gezAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMH0uCjwvcD4KCjxoND48YSBuYW1lPSJWYXJpYW50Ij5WYXJpYW50PC9hPjwvaDQ+CjxwPlRocmVlIGJpdHMgb2YgYSA8Yj51dWlkPC9iPiBkZXRlcm1pbmUgdGhlIHZhcmlhbnQuPC9wPgo8cHJlPgogICAgYm9vc3Q6OnV1aWRzOjp1dWlkIHU7CiAgICBib29zdDo6dXVpZHM6OnV1aWQ6OnZhcmlhbnRfdHlwZSB2ID0gdS52YXJpYW50KCk7CjwvcHJlPgoKPGg0PjxhIG5hbWU9IlZlcnNpb24iPlZlcnNpb248L2E+PC9oND4KPHA+Rm91ciBiaXRzIG9mIGEgPGI+dXVpZDwvYj4gZGV0ZXJtaW5lIHRoZSB2YXJpYW50LCB0aGF0IGlzIHRoZSBtZWNoYW5pc20KdXNlZCB0byBnZW5lcmF0ZSB0aGUgPGI+dXVpZDwvYj4uCjwvcD4KPHByZT4KICAgIGJvb3N0Ojp1dWlkczo6dXVpZCB1OwogICAgYm9vc3Q6OnV1aWRzOjp1dWlkOjp2ZXJzaW9uX3R5cGUgdiA9IHUudmVyc2lvbigpOwo8L3ByZT4KCjxoND48YSBuYW1lPSJTd2FwIj5Td2FwPC9hPjwvaDQ+CjxwPkJvdGggPHR0PmJvb3N0Ojp1dWlkczo6dXVpZDo6c3dhcCgpPC90dD4gYW5kIDx0dD5ib29zdDo6dXVpZHM6OnN3YXAoKTwvdHQ+IAphcmUgcHJvdmlkZWQuCjwvcD4KPHByZT4KICAgIGJvb3N0Ojp1dWlkczo6dXVpZCB1MSwgdTI7CiAgICB1MS5zd2FwKHUyKTsKICAgIHN3YXAodTEsIHUyKTsKPC9wcmU+Cgo8aDQ+PGEgbmFtZT0iT3BlcmF0b3JzIj5PcGVyYXRvcnM8L2E+PC9oND4KPHA+CkFsbCBvZiB0aGUgc3RhbmRhcmQgbnVtZXJpYyBvcGVyYXRvcnMgYXJlIGRlZmluZWQgZm9yIHRoZSA8Yj51dWlkPC9iPgpjbGFzcy4gVGhlc2UgaW5jbHVkZToKPHByZT4KICAgIG9wZXJhdG9yPT0KICAgIG9wZXJhdG9yIT0KICAgIG9wZXJhdG9yJmx0OwogICAgb3BlcmF0b3ImZ3Q7CiAgICBvcGVyYXRvciZsdDs9CiAgICBvcGVyYXRvciZndDs9CjwvcHJlPgoKPGg0PjxhIG5hbWU9Ikhhc2giPkhhc2ggRnVuY3Rpb248L2E+PC9oND4KPHA+ClRoaXMgZnVuY3Rpb24gYWxsb3dzIDxiPnV1aWQ8L2I+cyB0byBiZSB1c2VkIHdpdGggCjxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9odG1sL2hhc2guaHRtbCI+PGI+Ym9vc3Q6Omhhc2g8L2I+PC9hPgoKPHByZT4KYm9vc3Q6Omhhc2gmbHQ7Ym9vc3Q6OnV1aWRzOjp1dWlkJmd0OyB1dWlkX2hhc2hlcjsKc3RkOjpzaXplX3QgdXVpZF9oYXNoX3ZhbHVlID0gdXVpZF9oYXNoZXIoYm9vc3Q6OnV1aWRzOjp1dWlkKCkpOwo8L3ByZT4KCjxoMz48YSBuYW1lPSJib29zdC91dWlkL3V1aWRfZ2VuZXJhdG9ycy5ocHAiIGhyZWY9Ii4vLi4vLi4vYm9vc3QvdXVpZC91dWlkX2dlbmVyYXRvcnMuaHBwIj5ib29zdC91dWlkL3V1aWRfZ2VuZXJhdG9ycy5ocHA8L2E+PC9oMz4KPGg0PjxhIG5hbWU9IlN5bm9wc2lzX2dlbmVyYXRvcnMiPlN5bm9wc2lzPC9hPjwvaDQ+ClRoaXMgZmlsZSBpbmNsdWRlcyBhbGwgdGhlIDxiPnV1aWQ8L2I+IGdlbmVyYXRvcnMgZm9yIGNvbnZlbmllbmNlLgo8cHJlPgojaW5jbHVkZSAmbHQ7PGEgaHJlZj0iLi8uLi8uLi9ib29zdC91dWlkL25pbF9nZW5lcmF0b3IuaHBwIj48dHQ+Ym9vc3QvdXVpZC9uaWxfZ2VuZXJhdG9yLmhwcDwvdHQ+PC9hPiZndDsKI2luY2x1ZGUgJmx0OzxhIGhyZWY9Ii4vLi4vLi4vYm9vc3QvdXVpZC9zdHJpbmdfZ2VuZXJhdG9yLmhwcCI+PHR0PmJvb3N0L3V1aWQvc3RyaW5nX2dlbmVyYXRvci5ocHA8L3R0PjwvYT4mZ3Q7CiNpbmNsdWRlICZsdDs8YSBocmVmPSIuLy4uLy4uL2Jvb3N0L3V1aWQvbmFtZV9nZW5lcmF0b3IuaHBwIj48dHQ+Ym9vc3QvdXVpZC9uYW1lX2dlbmVyYXRvci5ocHA8L3R0PjwvYT4mZ3Q7CiNpbmNsdWRlICZsdDs8YSBocmVmPSIuLy4uLy4uL2Jvb3N0L3V1aWQvcmFuZG9tX2dlbmVyYXRvci5ocHAiPjx0dD5ib29zdC91dWlkL3JhbmRvbV9nZW5lcmF0b3IuaHBwPC90dD48L2E+Jmd0Owo8L3ByZT4KCjxoMz48YSBuYW1lPSJib29zdC91dWlkL25pbF9nZW5lcmF0b3IuaHBwIiBocmVmPSIuLy4uLy4uL2Jvb3N0L3V1aWQvbmlsX2dlbmVyYXRvci5ocHAiPmJvb3N0L3V1aWQvbmlsX2dlbmVyYXRvci5ocHA8L2E+PC9oMz4KPGg0PjxhIG5hbWU9IlN5bm9wc2lzX25pbF9nZW5lcmF0b3IiPlN5bm9wc2lzPC9hPjwvaDQ+CjxwcmU+Cm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSB1dWlkcyB7CgpzdHJ1Y3QgbmlsX2dlbmVyYXRvciB7CiAgICB0eXBlZGVmIHV1aWQgcmVzdWx0X3R5cGU7CiAgICAKICAgIHV1aWQgb3BlcmF0b3IoKSgpIGNvbnN0Owp9Owp1dWlkIG5pbF91dWlkKCk7Cgp9fSAvL25hbWVzcGFjZSBib29zdDo6dXVpZHMKPC9wcmU+Cgo8aDQ+PGEgbmFtZT0iTmlsIEdlbmVyYXRvciI+TmlsIEdlbmVyYXRvcjwvYT48L2g0Pgo8cD5UaGUgPHR0PmJvb3N0Ojp1dWlkczo6bmlsX2dlbmVyYXRvcjwvdHQ+IGNsYXNzIGFsd2F5cyBnZW5lcmF0ZXMgYSBuaWwgPGI+dXVpZDwvYj4uCjxwcmU+CmJvb3N0Ojp1dWlkczo6bmlsX2dlbmVyYXRvciBnZW47CmJvb3N0Ojp1dWlkczo6dXVpZCB1ID0gZ2VuKCk7CmFzc2VydCh1LmlzX25pbCgpID09IHRydWUpOwoKLy8gb3IgZm9yIGNvbnZlbmllbmNlCmJvb3N0Ojp1dWlkczo6dXVpZCB1ID0gYm9vc3Q6OnV1aWRzOjpuaWxfdXVpZCgpOwphc3NlcnQodS5pc19uaWwoKSA9PSB0cnVlKTsKPC9wcmU+Cgo8aDM+PGEgbmFtZT0iYm9vc3QvdXVpZC9zdHJpbmdfZ2VuZXJhdG9yLmhwcCIgaHJlZj0iLi8uLi8uLi9ib29zdC91dWlkL3N0cmluZ19nZW5lcmF0b3IuaHBwIj5ib29zdC91dWlkL3N0cmluZ19nZW5lcmF0b3IuaHBwPC9hPjwvaDM+CjxoND48YSBuYW1lPSJTeW5vcHNpc19zdHJpbmdfZ2VuZXJhdG9yIj5TeW5vcHNpczwvYT48L2g0PgoKPHByZT4KbmFtZXNwYWNlIGJvb3N0IHsKbmFtZXNwYWNlIHV1aWRzIHsKCnN0cnVjdCBzdHJpbmdfZ2VuZXJhdG9yIHsKICAgIHR5cGVkZWYgdXVpZCByZXN1bHRfdHlwZTsKCiAgICB0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgY2gsIHR5cGVuYW1lIGNoYXJfdHJhaXRzLCB0eXBlbmFtZSBhbGxvYyZndDsKICAgICAgICB1dWlkIG9wZXJhdG9yKCkoc3RkOjpiYXNpY19zdHJpbmcmbHQ7Y2gsIGNoYXJfdHJhaXRzLCBhbGxvYyZndDsgY29uc3QmYW1wOyBzKSBjb25zdDsKfTsKCn19IC8vbmFtZXNwYWNlIGJvb3N0Ojp1dWlkcwo8L3ByZT4KCjxoND48YSBuYW1lPSJTdHJpbmcgR2VuZXJhdG9yIj5TdHJpbmcgR2VuZXJhdG9yPC9hPjwvaDQ+CjxwPlRoZSA8dHQ+Ym9vc3Q6OnV1aWRzOjpzdHJpbmdfZ2VuZXJhdG9yPC90dD4gY2xhc3MgZ2VuZXJhdGVzIGEgPGI+dXVpZDwvYj4gZnJvbSBhIHN0cmluZy4KPHByZT4KYm9vc3Q6OnV1aWRzOjpzdHJpbmdfZ2VuZXJhdG9yIGdlbjsKYm9vc3Q6OnV1aWRzOjp1dWlkIHUxID0gZ2VuKCJ7MDEyMzQ1NjctODlhYi1jZGVmLTAxMjMtNDU2Nzg5YWJjZGVmfSIpOwpib29zdDo6dXVpZHM6OnV1aWQgdTIgPSBnZW4oTCIwMTIzNDU2Ny04OWFiLWNkZWYtMDEyMy00NTY3ODlhYmNkZWYiKTsKYm9vc3Q6OnV1aWRzOjp1dWlkIHUzID0gZ2VuKHN0ZDo6c3RyaW5nKCIwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZiIpKTsKYm9vc3Q6OnV1aWRzOjp1dWlkIHU0ID0gZ2VuKHN0ZDo6d3N0cmluZyhMIjAxMjM0NTY3LTg5YWItY2RlZi0wMTIzLTQ1Njc4OWFiY2RlZiIpKTsKPC9wcmU+Cgo8aDM+PGEgbmFtZT0iYm9vc3QvdXVpZC9uYW1lX2dlbmVyYXRvci5ocHAiIGhyZWY9Ii4vLi4vLi4vYm9vc3QvdXVpZC9uYW1lX2dlbmVyYXRvci5ocHAiPmJvb3N0L3V1aWQvbmFtZV9nZW5lcmF0b3IuaHBwPC9hPjwvaDM+CjxoND48YSBuYW1lPSJTeW5vcHNpc19uYW1lX2dlbmVyYXRvciI+U3lub3BzaXM8L2E+PC9oND4KCjxwcmU+Cm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSB1dWlkcyB7CgpjbGFzcyBuYW1lX2dlbmVyYXRvciB7CnB1YmxpYzoKICAgIHR5cGVkZWYgdXVpZCByZXN1bHRfdHlwZTsKICAgIAogICAgZXhwbGljaXQgbmFtZV9nZW5lcmF0b3IodXVpZCBjb25zdCZhbXA7IG5hbWVzcGFjZV91dWlkKTsKCiAgICB1dWlkIG9wZXJhdG9yKCkoY29uc3QgY2hhciogbmFtZSkgY29uc3Q7CiAgICB1dWlkIG9wZXJhdG9yKCkoY29uc3Qgd2NoYXJfdCogbmFtZSkgY29uc3Q7CiAgICB0ZW1wYXRlICZsdDt0eXBlbmFtZSBjaCwgdHlwZW5hbWUgY2hhcl90cmFpdHMsIHR5cGVuYW1lIGFsbG9jJmd0OwogICAgICAgIHV1aWQgb3BlcmF0b3IoKShzdGQ6OmJhc2ljX3N0cmluZyZsdDtjaCwgY2hhcl90cmFpdHMsIGFsbG9jJmd0OyBjb25zdCZhbXA7IG5hbWUpIGNvbnN0OwogICAgdXVpZCBvcGVyYXRvcigpKHZvaWQgY29uc3QqIGJ1ZmZlciwgc3RkOjpzaXplX3QgYnl0ZV9jb3VudCkgY29uc3Q7Cn07Cgp9fSAvL25hbWVzcGFjZSBib29zdDo6dXVpZHMKPC9wcmU+Cgo8aDQ+PGEgbmFtZT0iTmFtZSBHZW5lcmF0b3IiPk5hbWUgR2VuZXJhdG9yPC9hPjwvaDQ+CjxwPgpUaGUgPHR0PmJvb3N0Ojp1dWlkczo6bmFtZV9nZW5lcmF0b3I8L3R0PiBjbGFzcyBnZW5lcmF0ZXMgYSBuYW1lIGJhc2VkIDxiPnV1aWQ8L2I+IGZyb20gYQpuYW1lc3BhY2UgdXVpZCBhbmQgYSBuYW1lLgo8cHJlPgpib29zdDo6dXVpZHM6OnV1aWQgZG5zX25hbWVzcGFjZV91dWlkOyAvLyBpbml0aWFsaXplIHRvIHs2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9Cgpib29zdDo6dXVpZHM6Om5hbWVfZ2VuZXJhdG9yIGdlbihkbnNfbmFtZXNwYWNlX3V1aWQpOwpib29zdDo6dXVpZHM6OnV1aWQgdSA9IGdlbigiYm9vc3Qub3JnIik7CjwvcHJlPgoKPGgzPjxhIG5hbWU9ImJvb3N0L3V1aWQvcmFuZG9tX2dlbmVyYXRvci5ocHAiIGhyZWY9Ii4vLi4vLi4vYm9vc3QvdXVpZC9yYW5kb21fZ2VuZXJhdG9yLmhwcCI+Ym9vc3QvdXVpZC9yYW5kb21fZ2VuZXJhdG9yLmhwcDwvYT48L2gzPgo8aDQ+PGEgbmFtZT0iU3lub3BzaXNfcmFuZG9tX2dlbmVyYXRvciI+U3lub3BzaXM8L2E+PC9oND4KCjxwcmU+Cm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSB1dWlkcyB7Cgp0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciZndDsKY2xhc3MgYmFzaWNfcmFuZG9tX2dlbmVyYXRvciB7CnB1YmxpYzoKICAgIHR5cGVkZWYgdXVpZCByZXN1bHRfdHlwZTsKICAgIAogICAgYmFzaWNfcmFuZG9tX2dlbmVyYXRvcigpOwogICAgZXhwbGljaXQgYmFzaWNfcmFuZG9tX2dlbmVyYXRvcihVbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJmFtcDsgZ2VuKTsKICAgIGV4cGxpY2l0IGJhc2ljX3JhbmRvbV9nZW5lcmF0b3IoVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciogcEdlbik7CiAgICAKICAgIHV1aWQgb3BlcmF0b3IoKSgpOwp9Owp0eXBlZGVmIGJhc2ljX3JhbmRvbV9nZW5lcmF0b3ImbHQ7bXQxOTkzNyZndDsgcmFuZG9tX2dlbmVyYXRvcjsKCn19IC8vIG5hbWVzcGFjZSBib29zdDo6dXVpZHMKPC9wcmU+Cgo8aDQ+PGEgbmFtZT0iUmFuZG9tIEdlbmVyYXRvciI+UmFuZG9tIEdlbmVyYXRvcjwvYT48L2g0Pgo8cD4KVGhlIDx0dD5ib29zdDo6dXVpZHM6OmJhc2ljX3JhbmRvbV9nZW5lcmF0b3I8L3R0PiBjbGFzcyBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyCmJhc2VkIHV1aWQgZnJvbSBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChvbmUgdGhhdCBjb25mb3JtcyB0byB0aGUgCjxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvcmFuZG9tL3JhbmRvbS1jb25jZXB0cy5odG1sI3VuaWZvcm0tcm5nIj5Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPC9hPgpjb25jZXB0KS4KPHByZT4KLy9kZWZhdWx0IGNvbnN0cnVjdCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYW5kIHNlZWQgaXQKYm9vc3Q6OnV1aWRzOjpiYXNpY19yYW5kb21fZ2VuZXJhdG9yJmx0O2Jvb3N0OjptdDE5OTM3Jmd0OyBnZW47CmJvb3N0Ojp1dWlkczo6dXVpZCB1ID0gZ2VuKCk7CgovL2ZvciBjb252ZW5pZW5jZSBib29zdDo6dXVpZHM6OnJhbmRvbV9nZW5lcmF0b3IKLy9pcyBlcXVpdmFsZW50IHRvIGJvb3N0Ojp1dWlkczo6YmFzaWNfcmFuZG9tX2dlbmVyYXRvciZsdDtib29zdDo6bXQxOTkzNyZndDsKYm9vc3Q6OnV1aWRzOjpyYW5kb21fZ2VuZXJhdG9yIGdlbjsKYm9vc3Q6OnV1aWRzOjp1dWlkIHUgPSBnZW4oKTsKCi8vdXNlIGFuIGV4aXN0aW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi8vcGFzcyBlaXRoZXIgYSByZWZlcmVuY2Ugb3IgYSBwb2ludGVyIHRvIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgpib29zdDo6bXQxOTkzNyByYW47CmJvb3N0Ojp1dWlkczo6YmFzaWNfcmFuZG9tX2dlbmVyYXRvciZsdDtib29zdDo6bXQxOTkzNyZndDsgZ2VuKCZhbXA7cmFuKTsKYm9vc3Q6OnV1aWRzOjp1dWlkIHUgPSBnZW4oKTsKPC9wcmU+Cgo8aDM+PGEgbmFtZT0iYm9vc3QvdXVpZC91dWlkX2lvLmhwcCIgaHJlZj0iLi8uLi8uLi9ib29zdC91dWlkL3V1aWRfaW8uaHBwIj5ib29zdC91dWlkL3V1aWRfaW8uaHBwPC9hPjwvaDM+CjxoND48YSBuYW1lPSJTeW5vcHNpc19pbyI+U3lub3BzaXM8L2E+PC9oND4KPHByZT4KbmFtZXNwYWNlIGJvb3N0IHsKbmFtZXNwYWNlIHV1aWRzIHsKCnRlbXBsYXRlICZsdDt0eXBlbmFtZSBjaCwgdHlwZW5hbWUgY2hhcl90cmFpdHMmZ3Q7CiAgICBzdGQ6OmJhc2ljX29zdHJlYW0mbHQ7Y2gsIGNoYXJfdHJhaXRzJmd0OyZhbXA7IG9wZXJhdG9yJmx0OyZsdDsoc3RkOjpiYXNpY19vc3RyZWFtJmx0O2NoLCBjaGFyX3RyYWl0cyZndDsgJmFtcDtvcywgdXVpZCBjb25zdCZhbXA7IHUpOwoKdGVtcGxhdGUgJmx0O3R5cGVuYW1lIGNoLCB0eXBlbmFtZSBjaGFyX3RyYWl0cyZndDsKICAgIHN0ZDo6YmFzaWNfaXN0cmVhbSZsdDtjaCwgY2hhcl90cmFpdHMmZ3Q7JmFtcDsgb3BlcmF0b3ImZ3Q7Jmd0OyhzdGQ6OmJhc2ljX2lzdHJlYW0mbHQ7Y2gsIGNoYXJfdHJhaXRzJmd0OyAmYW1wO2lzLCB1dWlkICZhbXA7dSk7CiAgICAKc3RkOjpzdHJpbmcgdG9fc3RyaW5nKHV1aWQgY29uc3QmYW1wOyB1KTsKc3RkOjp3c3RyaW5nIHRvX3dzdHJpbmcodXVpZCBjb25zdCZhbXA7IHUpOwoKfX0gLy8gbmFtZXNwYWNlIGJvb3N0Ojp1dWlkcwo8L3ByZT4KCjxoND48YSBuYW1lPSJTdHJlYW1fb3BlcmF0b3JzIj5TdHJlYW0gT3BlcmF0b3JzPC9hPjwvaDQ+CjxwPgpUaGUgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW0gb3BlcmF0b3JzIDx0dD4mbHQ7Jmx0OzwvdHQ+IGFuZCA8dHQ+Jmd0OyZndDs8L3R0PgphcmUgcHJvdmlkZWQgYnkgaW5jbHVkaW5nIDxhIGhyZWY9Ii4uLy4uL2Jvb3N0L3V1aWQvdXVpZF9pby5ocHAiPjx0dD5ib29zdC91dWlkL3V1aWRfaW8uaHBwPC90dD48L2E+LgpUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgPGI+dXVpZDwvYj4gaXMgPHR0PmhoaGhoaGhoLWhoaGgtaGhoaC1oaGhoLWhoaGhoaGhoaGhoaDwvdHQ+IAp3aGVyZSA8dHQ+aDwvdHQ+IGlzIGEgaGV4aWRlY2ltYWwgZGlnaXQuCjxwcmU+CmJvb3N0Ojp1dWlkczo6dXVpZCB1MTsgLy8gaW5pdGlhbGl6ZSB1dWlkCgpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKc3MgJmx0OyZsdDsgdTE7Cgpib29zdDo6dXVpZHM6OnV1aWQgdTI7CnNzICZndDsmZ3Q7IHUyOwoKYXNzZXJ0KHUxLCB1Mik7CjwvcHJlPgoKPHA+Ck9uZSBjYW4gYWxzbyB1c2UgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9jb252ZXJzaW9uL2xleGljYWxfY2FzdC5odG0iPjx0dD5ib29zdDo6bGV4aWNhbF9jYXN0PC90dD48L2E+Lgo8cHJlPgpib29zdDo6dXVpZHM6OnV1aWQgdTE7IC8vIGluaXRpYWxpemUgdXVpZAoKc3RkOjpzdHJpbmcgcyA9IGJvb3N0OjpsZXhpY2FsX2Nhc3QmbHQ7c3RkOjpzdHJpbmcmZ3Q7KHUpOwpib29zdDo6dXVpZHM6OnV1aWQgdTIgPSBib29zdDo6bGV4aWNhbF9jYXN0Jmx0O2Jvb3N0Ojp1dWlkczo6dXVpZCZndDsocyk7Cgphc3NlcnQodTEgPT0gdTIpOwo8L3ByZT4KCjxoND48YSBuYW1lPSJ0b19zdHJpbmciPlRvIFN0cmluZzwvYT48L2g0Pgo8cD4KVGhlIGZ1bmN0aW9ucyA8dHQ+dG9fc3RyaW5nPC90dD4gYW5kIDx0dD50b193c3RyaW5nPC90dD4gYXJlIHByb3ZpZGVkIGFzIGEgCmNvbnZlbmllbmNlIHRvIGNvbnZlcnQgYSA8Yj51dWlkPC9iPiB0byBhIHN0cmluZy4gIFRoZXkgYXJlIGFsc28gbGlrZWx5IGZhc3RlciB0aGFuCnRoZSBzdHJlYW0gb3BlcmF0b3JzIG9yIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvY29udmVyc2lvbi9sZXhpY2FsX2Nhc3QuaHRtIj48dHQ+Ym9vc3Q6OmxleGljYWxfY2FzdDwvdHQ+PC9hPi4KPHByZT4KYm9vc3Q6OnV1aWRzOjp1dWlkIHU7IC8vIGluaXRpYWxpemUgdXVpZAoKc3RkOjpzdHJpbmcgczEgPSB0b19zdHJpbmcodSk7CgpzdGQ6OndzdHJpbmcgczIgPSB0b193c3RyaW5nKHUpOwo8L3ByZT4KCjxoMz48YSBuYW1lPSJib29zdC91dWlkL3V1aWRfc2VyaWFsaXplLmhwcCIgaHJlZj0iLi8uLi8uLi9ib29zdC91dWlkL3V1aWRfc2VyaWFsaXplLmhwcCI+Ym9vc3QvdXVpZC91dWlkX3NlcmlhbGl6ZS5ocHA8L2E+PC9oMz4KPGg0PjxhIG5hbWU9IlN5bm9wc2lzX3NlcmlhbGl6ZSI+U3lub3BzaXM8L2E+PC9oND4KPHByZT4KbmFtZXNwYWNlIGJvb3N0IHsKbmFtZXNwYWNlIHV1aWRzIHsKCkJPT1NUX0NMQVNTX0lNUExFTUVOVEFUSU9OKGJvb3N0Ojp1dWlkczo6dXVpZCwgYm9vc3Q6OnNlcmlhbGl6YXRpb246OnByaW1pdGl2ZV90eXBlKQoKfX0gLy8gbmFtZXNwYWNlIGJvb3N0Ojp1dWlkcwo8L3ByZT4KCjxoND48YSBuYW1lPSJTZXJpYWxpemF0aW9uIj5TZXJpYWxpemF0aW9uPC9hPjwvaDQ+CjxwPgpTZXJpYWxpemF0aW9uIGlzIGFjY29tcGxpc2hlZCB3aXRoIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3NlcmlhbGl6YXRpb24vZG9jL2luZGV4Lmh0bWwiPgpCb29zdCBTZXJpYWxpemF0aW9uPC9hPiBsaWJyYXJ5LiAgQSA8Yj51dWlkPC9iPiBpcyBzZXJpYWxpemVkIGFzIGEgCjxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvc2VyaWFsaXphdGlvbi9kb2Mvc2VyaWFsaXphdGlvbi5odG1sI3ByaW1pdGl2ZW9wZXJhdG9ycyI+CnByaW1pdGl2ZSB0eXBlPC9hPiwgdGh1cyBvbmx5IHRoZSA8Yj51dWlkPC9iPiB2YWx1ZSB3aWxsIGJlIHNhdmVkIHRvL2xvYWRlZCBmcm9tIGFuIGFyY2hpdmUuCjxwPgpJbmNsdWRlIDxhIGhyZWY9Ii4uLy4uL2Jvb3N0L3V1aWQvdXVpZF9zZXJpYWxpemUuaHBwIj48dHQ+Ym9vc3QvdXVpZC91dWlkX3NlcmlhbGl6ZS5ocHA8L3R0PjwvYT4gdG8gZW5hYmxlIHNlcmlhbGl6YXRpb24gZm9yIDxiPnV1aWQ8L2I+cy4KCjxoMj48YSBuYW1lPSJEZXNpZ24gbm90ZXMiPkRlc2lnbiBub3RlczwvYT48L2gyPgo8cD4KVGhlIGRvY3VtZW50LCA8YSBocmVmPSJodHRwOi8vd3d3Lml0dS5pbnQvSVRVLVQvc3R1ZHlncm91cHMvY29tMTcvb2lkL1guNjY3LUUucGRmIj4KaHR0cDovL3d3dy5pdHUuaW50L0lUVS1UL3N0dWR5Z3JvdXBzL2NvbTE3L29pZC9YLjY2Ny1FLnBkZjwvYT4sIHdhcyB1c2VkIHRvIGRlc2lnbgphbmQgaW1wbGVtZW50IHRoZSA8Yj5ib29zdDo6dXVpZHM6OnV1aWQ8L2I+IHN0cnVjdC4KCjxwPlRoZSA8dHQ+Ym9vc3Q6OnV1aWRzOjpiYXNpY19yYW5kb21fZ2VuZXJhdG9yPC90dD4gY2xhc3MnIGRlZmF1bHQgY29uc3RydWN0b3IgCnNlZWRzIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIGEgU0hBLTEgaGFzaCBvZiBhIG51bWJlciBvZiBkaWZmZXJlbnQKdmFsdWVzIGluY2x1ZGluZyA8dHQ+c3RkOjp0aW1lKDApPC90dD4sIDx0dD5zdGQ6OmNsb2NrKCk8L3R0PiwgdW5pbml0aWFsaXplZApkYXRhLCB2YWx1ZSByZXR1cm4gZnJvbSA8dHQ+bmV3IHVuc2lnbmVkIGludDwvdHQ+LCBldGMuLgoKPHA+VXNpbmcgPGEgaHJlZj0iaHR0cDovL3ZhbGdyaW5kLm9yZy8iPlZhbGdyaW5kPC9hPiBwcm9kdWNlcyBhIG51bWJlciBvZiBmYWxzZQpwb3NpdGl2ZXMgd2l0aCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBvZiA8dHQ+Ym9vc3Q6OnV1aWRzOjpiYXNpY19yYW5kb21fZ2VuZXJhdG9yPC90dD4uICAKT25lIHNvbHV0aW9uIGlzIHRvIHN1cHByZXNzIHRoZSBlcnJvcnMgYXMgZGVzY3JpYmVkIGluCjxhIGhyZWY9Imh0dHA6Ly92YWxncmluZC5vcmcvZG9jcy9tYW51YWwvbWFudWFsLWNvcmUuaHRtbCNtYW51YWwtY29yZS5zdXBwcmVzcyI+VmFsZ3JpbmQncyBkb2N1bWVudGF0aW9uPC9hPi4KQW5vdGhlciBzb2x1dGlvbiBpcyB0byB1c2UgYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igb2YgPHR0PmJvb3N0Ojp1dWlkczo6YmFzaWNfcmFuZG9tX2dlbmVyYXRvcjwvdHQ+CmFuZCBleHBsaWNpdGx5IHBhc3MgaW4gYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KPHByZT4KYm9vc3Q6Om10MTk5MzcgcmFuOwpyYW4uc2VlZCh0aW1lKE5VTEwpKTsgLy8gb25lIHNob3VsZCBsaWtlbHkgc2VlZCBpbiBhIGJldHRlciB3YXkKYm9vc3Q6OnV1aWRzOjpiYXNpY19yYW5kb21fZ2VuZXJhdG9yJmx0O2Jvb3N0OjptdDE5OTM3Jmd0OyBnZW4oJnJhbik7CmJvb3N0Ojp1dWlkczo6dXVpZCB1ID0gZ2VuKCk7CjwvcHJlPgoKPHA+VGhlIDx0dD5ib29zdDo6dXVpZHM6Om5hbWVfZ2VuZXJhdG9yPC90dD4gY2xhc3MgdXNlcyB0aGUgU0hBLTEgaGFzaCBmdW5jdGlvbiB0bwpjb21wdXRlIHRoZSA8Yj51dWlkPC9iPi4KCjxwPkFsbCBmdW5jdGlvbnMgYXJlIHJlLWVudHJhbnQuICBDbGFzc2VzIGFyZSBhcyB0aHJlYWQtc2FmZSBhcyBhbiBpbnQuICBUaGF0IGlzIGFuIAppbnN0YW5jZSBjYW4gbm90IGJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMgd2l0aG91dCBwcm9wZXIgc3luY2hyb25pemF0aW9uLgoKPGgyPjxhIG5hbWU9Ikhpc3RvcnkgYW5kIEFja25vd2xlZGdlbWVudHMiPkhpc3RvcnkgYW5kIEFja25vd2xlZGdlbWVudHM8L2E+PC9oMj4KPHA+CkEgbnVtYmVyIG9mIHBlb3BsZSBvbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvIj5ib29zdC5vcmc8L2E+IAptYWlsaW5nIGxpc3QgcHJvdmlkZWQgdXNlZnVsIGNvbW1lbnRzIGFuZCBncmVhdGx5IGhlbHBlZCB0byBzaGFwZSB0aGUgbGlicmFyeS4KCjxwPlJldmlzZWQmbmJzcDsgRmVicnVhcnkgNiwgMjAxMDwvcD4KCjxocj4KPHA+qSBDb3B5cmlnaHQgQW5keSBUb21wa2lucywgMjAwNjwvcD4KPHA+IERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSAKTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgPGEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij5MSUNFTlNFXzFfMC50eHQ8L2E+IG9yIGNvcHkgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij4Kd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvcD4KPC9ib2R5Pgo8L2h0bWw+Cg==